天天看點

《設計模式之禅》六大設計原則(三)-依賴倒置原則

(三) 依賴倒置(DIP-Denpendence Inversion Princle)

1.     概念:通俗來講就是面向接口的程式設計

(1)高層子產品兒(原子邏輯的再組裝)不應該依賴于低層子產品兒(不可分割的原子邏輯),二者都應該依賴于其抽象(在java語言中就是抽象類或是接口,二者都不可執行個體化);

(2)抽象不應該依賴于細節(java中表現為實作類,可被執行個體化);

(3)細節應該依賴抽象

2. 示例:一個簡單的司機開車的場景,其類圖如3-1所示,這三個簡單的類,其中Client屬于高層子產品兒,Driver和Benz都屬于低層子產品兒,三者都屬于實作類。設計的好壞在于是否能夠有效的應付變化,如果換一輛寶馬,司機是否還能繼續開呢?由于Driver依賴于具體的Benz類,是以無法進行有效的變化,如果引入依賴倒置原則,則可變為圖3-2,将具體的Driver和Car進行了解耦。

《設計模式之禅》六大設計原則(三)-依賴倒置原則
《設計模式之禅》六大設計原則(三)-依賴倒置原則

                                        圖3-1司機開奔馳                                                                 圖3-2司機開好多車

3.示例引申:對象的依賴關系有三種方式來進行傳遞:

a.構造函數依賴

public interface IDriver{
    //是司機就會駕車
   public void drive();
}
public class Driver implements IDriver{
 private ICar car;
public Driver(ICar car){
      this.car=car;
}
public void run(){
     this.car.run();
}
}
           

b.Setter依賴

public interface IDriver{
  //車輛型号
    public void setCar(ICar  car);
      public void drive();
}
public Driver implements IDriver{
private ICar car;
public void setCar(ICar car){
 this.car=car;
}
public void drive{
this.car.run();
}
}
           

C.接口申明依賴,也叫做接口注入;如圖3-2所示

4.最佳實踐:;

每個類盡量都有接口或抽象類,或者二者都具備;

變量的表面類型盡量是接口或者抽象類;

任何類都不應該從具體類派生(不超過兩層的繼承可以忍受,但項目維護工作可以除外);

盡量不要覆寫基類(抽象類)的方法;

結合裡氏替換原則使用;

接口負責定義public屬性和方法,并且聲明與其他對象的依賴關系,抽象類負責公共構造部分的實作,實作類準确的實作業務邏輯,同時在适當的時候對父類進行細化

繼續閱讀