好久沒有寫博客啦,因最近在忙于弄自己的一個網(wǎng)站,一直沒有時間寫了,在這里跟廣大園友說聲抱歉,今天也正好是中秋節(jié),在這里祝大家節(jié)日快樂!廢話少說,接續(xù)上節(jié)的繼續(xù)寫下去。
依賴倒置原則(DependenceInversionPRinciple),簡稱DIP:他的核心思想就是在進(jìn)行業(yè)務(wù)設(shè)計時,高層模塊不應(yīng)該依賴于底層模塊,兩者應(yīng)該依賴與抽象,抽象而不依賴于具體實現(xiàn),具體實現(xiàn)應(yīng)該依賴與抽象,這樣會使代碼變得更穩(wěn)定,從而大大提高了程序應(yīng)對業(yè)務(wù)變化的能力。
我們來看一下一個例子來更深刻的理解一下上面的核心思想:
1 public class Car 2 3 { 4 5 public string CarName; 6 7 8 9 public Car(string carname)10 11 {12 13 this.CarName = carname;14 15 }16 17 public void 駕駛()18 19 {20 21 Console.WriteLine(CarName + ":駕駛");22 23 }24 25 26 27 }28 29 30 31 public class Person32 33 {34 35 public void drive()36 37 {38 39 Car bmw=new Car("BMW");40 41 bmw.駕駛();42 43 }44 45 }從上面的例子看一下能發(fā)現(xiàn)Person類依賴與Car類,這樣耦合度高,這樣的話比如說Car類發(fā)生變化時很容易出現(xiàn)問題,比如說哪天這個Person類不想開汽車了想開火車或者飛機時怎么辦,那我們可以改造一下上面的類,Person類不依賴于Car這個具體實現(xiàn),我們要依賴抽象,依賴與交通工具,我們看看代碼:
1 //交通工具才抽象 2 3 public interface IVehicle 4 5 { 6 7 void 駕駛(); 8 9 } 10 11 //汽車 12 13 public class Car : IVehicle 14 15 { 16 17 public string CarName; 18 19 20 21 public Car(string carname) 22 23 { 24 25 this.CarName = carname; 26 27 } 28 29 public void 駕駛() 30 31 { 32 33 Console.WriteLine(CarName + ":駕駛"); 34 35 } 36 37 38 39 } 40 41 //飛機 42 43 public class Plane : IVehicle 44 45 { 46 47 public string PlaneName; 48 49 50 51 public Plane(string carname) 52 53 { 54 55 this.PlaneName = carname; 56 57 } 58 59 public void 駕駛() 60 61 { 62 63 Console.WriteLine(PlaneName + ":駕駛"); 64 65 } 66 67 68 69 } 70 71 //火車 72 73 public class Train : IVehicle 74 75 { 76 77 public string TrainName; 78 79 80 81 public Train(string carname) 82 83 { 84 85 this.TrainName = carname; 86 87 } 88 89 public void 駕駛() 90 91 { 92 93 Console.WriteLine(TrainName + ":駕駛"); 94 95 } 96 97 98 99 }100 101 public class Person102 103 {104 105 private IVehicle machine = null;106 107 public Person(IVehicle _vehicle)108 109 {110 111 machine = _vehicle;112 113 }114 115 public void drive()116 117 {118 119 machine.駕駛();120 121 }122 123 }類圖如下:

客戶端調(diào)用代碼:
1 Person person1=new Person(new Car("寶馬")); 2 3 person1.drive(); 4 5 Person person2=new Person(new Plane("飛機")); 6 7 person2.drive(); 8 9 Person person3=new Person(new Train("火車"));10 11 person3.drive();12 13 Console.ReadLine();輸出結(jié)果如下:

從以上代碼可以看出Person類的駕駛方法來說不需要依賴具體的交通工具,只依賴抽象,具體的哪一個交通工具是從外部傳入的。這樣其實就是抽象編碼。也是依賴倒置的有點。
組合優(yōu)于繼承:他的核心思想就是組合比繼承更大的靈活性和穩(wěn)定結(jié)構(gòu)。
為什么怎么說呢,我們來看看他們各自的優(yōu)缺點:
繼承優(yōu)點:
1)新的實現(xiàn)很容易,因為大部分是繼承而來的。
2)很容易修改和擴展已有的實現(xiàn)
繼承的缺點:
1)打破了封裝,因為基類想子類暴露額具體的實現(xiàn)細(xì)節(jié)。
2)白盒重用,因為基類的內(nèi)部細(xì)節(jié)通常對子類是可見的。
3)當(dāng)父類發(fā)生改變時子類也做出相應(yīng)的改變。
4)不能在運行時修改由父類繼承來的實現(xiàn)。
組合優(yōu)點:
1)被包含對象通過包含他們的類來訪問
2)黑盒重用,因為被包含對象的內(nèi)部細(xì)節(jié)是不可見的
3)很好的封裝
4)每一個類都專注于一個任務(wù)
5)通過獲得和被包含對象的類型相同的對象引用,可以在運行時動態(tài)定義組合的方式
組合缺點:
1)系統(tǒng)可能會包含更過的對象
2)為了使組合時可以使用不同的對象,必須小心的定義接口。
新聞熱點
疑難解答