設(shè)計模式六大原則--依賴倒置原則(Dependence Inversion Principle ,DIP)


參考書籍:設(shè)計模式之禪 --- 秦小波 著

定義:
①高級模塊不應(yīng)該依賴于低級模塊仙蚜,兩者都應(yīng)該依賴于抽象耀找。
②抽象不應(yīng)該依賴于細節(jié)翔悠。
③細節(jié)應(yīng)該依賴于抽象。

那么高級模塊野芒、低級模塊蓄愁,抽象,細節(jié)各指的是什么呢狞悲?
每一個邏輯的實現(xiàn)都是由原子邏輯組成撮抓,不可分割的原子邏輯就是低級模塊。而低級模塊組裝就是高級模塊摇锋。
在Java中丹拯,抽象就是指接口或抽象類,兩者并不能直接被實例化荸恕。
細節(jié)就是實現(xiàn)類乖酬,繼承抽象類或?qū)崿F(xiàn)接口的類就是細節(jié)。特點是可以被直接實例化融求。

那么依賴倒置原則定義在Java語言中可以表示為:
①模塊間的依賴關(guān)系咬像、實現(xiàn)類間的依賴關(guān)系都是通過接口或抽象類產(chǎn)生。
②接口與抽象類不依賴實現(xiàn)類生宛。
③實現(xiàn)類依賴接口或抽象县昂。

從上述定義我們可以看出,依賴倒置原則的核心思想就是:面向接口編程

代碼重現(xiàn):

司機類
public class Driver {
   public void drive(Benz benz){
      benz.run();
   }
}

奔馳類
public class Benz {
   public void run(){
      System.out.println("開奔馳車上路");
   }
}

測試類
public class Demo_01 {
   public static void main(String[] args) {
         Driver sanmao = new Driver();
         sanmao.drive(new Benz());
   }
}
--------------------output---------------------------
開奔馳車上路

通過以上代碼完成了司機類開奔馳車的場景茅糜。
但是隨著業(yè)務(wù)需求的變更七芭,現(xiàn)在要求這個司機還能開寶馬車,那么上面代碼必須要重寫(耦合性太強)蔑赘,才能滿足業(yè)務(wù)需求狸驳,顯然上面代碼在設(shè)計上有錯誤预明。
那么我們依據(jù)依賴倒置原則重構(gòu)以上代碼:

司機接口類
public interface IDriver {
    void drive(ICar iCar);
}
司機實現(xiàn)類
public class Driver implements IDriver{
   @Override
   public void drive(ICar iCar) {
      iCar.run();
   }
}

汽車接口類
public interface ICar {
    void run();
}
汽車實現(xiàn)類
public class Benz implements ICar{
   @Override
   public void run() {
      System.out.println("開奔馳上路");
   }
}
public class BMW implements ICar {
   @Override
   public void run() {
      System.out.println("開寶馬上路");
   }
}

測試類
public class Demo_01 {
   public static void main(String[] args) {
    IDriver sanmao = new Driver();
    ICar benz = new Benz();
    ICar BMW = new BMW();
    sanmao.drive(benz);
    sanmao.drive(BMW);
   }
}
--------------------output---------------------------
開奔馳上路
開寶馬上路

Demo_01類就是高級模塊,他對所有低級模塊的依賴都建立在抽象類或接口上

在IDriver接口中傳入ICar接口耙箍,實現(xiàn)模塊間的依賴關(guān)系是通過接口或抽象類產(chǎn)生撰糠。在Driver實現(xiàn)類中也傳入了ICar接口,究竟使用Car的哪個子類還得在測試類中聲明辩昆。
在測試類中阅酪,我們貫徹“②接口與抽象類不依賴實現(xiàn)類≈耄”术辐,所以在測試類Demo_01中,我們都是聲明了各類的抽象施无。

注意:在Java中辉词,只要定義變量就必然要有類型。一個變量可以有兩種類型:表面類型與實際類型猾骡。表面類型是在定義時賦予的類型瑞躺,實際類型是對象的類型,如sanmao的表現(xiàn)類型是IDriver兴想,實際類型為Driver幢哨。

依賴的三種寫法
依賴是可以傳遞的。A對象依賴B對象嫂便,B依賴C捞镰,C依賴D...,
只要做到抽象依賴顽悼,即使是多層的依賴傳遞也無所畏懼曼振。
對象的依賴關(guān)系有以下三種方式傳遞几迄,可以參考Spring的依賴注入

①構(gòu)造函數(shù)傳遞依賴關(guān)系

public interface IDriver {
    void drive();
}

public class Driver implements IDriver{
   private ICar iCar;
   public Driver(ICar _iCar){
      this.iCar = _iCar;
   }
   
   public void drive() {
      this.iCar.run();
   }
}

②Setter方法傳遞依賴關(guān)系

public interface IDriver {
    void drive();
    void setCar(ICar _iCar);
}

public class Driver implements IDriver{
   private ICar iCar;
   @Override
   public void drive() {
      this.iCar.run();
   }
   @Override
   public void setCar(ICar _iCar) {
      this.iCar = _iCar;
   }
}

③接口聲明依賴關(guān)系

public interface IDriver {
    void drive(ICar iCar);
}

public class Driver implements IDriver{
   @Override
   public void drive(ICar iCar) {
      iCar.run();
   }
}

依賴倒置原則的本質(zhì)就是通過接口或抽象類使得各模塊間相互獨立蔚龙,互不影響,實現(xiàn)松耦合映胁。在使用這個原則時木羹,我們需要注意以下幾個原則:
①每個類都盡可能的都有接口或抽象類,或者抽象類和接口兩者都具備解孙。(依賴倒置原則的基本要求)
②變量的表面類型盡量是接口或者抽象類坑填。(工具類不需要接口或者抽象類,使用類的Clone方法弛姜,必須使用實現(xiàn)類脐瑰,這是JDK的規(guī)范)
③任何類都不應(yīng)該從具體類派生。
④盡量不要覆寫基類的方法廷臼。(若基類是一個抽象類苍在,此方法已經(jīng)實現(xiàn)绝页,那么子類就不應(yīng)該覆寫)
⑤結(jié)合里氏替換原則使用
接口負責public屬性與方法,并且聲明與其他對象的依賴關(guān)系寂恬,抽象類負責公共構(gòu)造部分的實現(xiàn)续誉,實現(xiàn)類準確的實現(xiàn)業(yè)務(wù)邏輯,同時在適當?shù)臅r候?qū)Ω割愡M行細化初肉。

上面講完了依賴關(guān)系與原則酷鸦,那么什么叫倒置呢?
要理解倒置牙咏,首先我們得知道什么叫“正置”臼隔。依賴正置就是類之間的依賴是實現(xiàn)類間的依賴,也就是面向?qū)崿F(xiàn)編程妄壶。但是編寫程序需要的是對現(xiàn)實世界的事物進行抽象躬翁,轉(zhuǎn)化為我們熟知的抽象類或接口,這樣我們就可以將模塊間的依賴關(guān)系盯拱、實現(xiàn)類間的依賴關(guān)系都是通過接口或抽象類產(chǎn)生盒发。這就是我們所說的“倒置”。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狡逢,一起剝皮案震驚了整個濱河市宁舰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奢浑,老刑警劉巖蛮艰,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異雀彼,居然都是意外死亡壤蚜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門徊哑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來袜刷,“玉大人,你說我怎么就攤上這事莺丑≈罚” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵梢莽,是天一觀的道長萧豆。 經(jīng)常有香客問我,道長昏名,這世上最難降的妖魔是什么涮雷? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮轻局,結(jié)果婚禮上洪鸭,老公的妹妹穿的比我還像新娘膜钓。我一直安慰自己,他們只是感情好卿嘲,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布颂斜。 她就那樣靜靜地躺著,像睡著了一般拾枣。 火紅的嫁衣襯著肌膚如雪沃疮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天梅肤,我揣著相機與錄音司蔬,去河邊找鬼。 笑死姨蝴,一個胖子當著我的面吹牛俊啼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播左医,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼授帕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了浮梢?” 一聲冷哼從身側(cè)響起跛十,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎秕硝,沒想到半個月后芥映,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡远豺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年奈偏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躯护。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡惊来,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出榛做,到底是詐尸還是另有隱情唁盏,我是刑警寧澤内狸,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布检眯,位于F島的核電站,受9級特大地震影響昆淡,放射性物質(zhì)發(fā)生泄漏锰瘸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一昂灵、第九天 我趴在偏房一處隱蔽的房頂上張望避凝。 院中可真熱鬧舞萄,春花似錦、人聲如沸管削。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽含思。三九已至崎弃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間含潘,已是汗流浹背饲做。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留遏弱,地道東北人盆均。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像漱逸,于是被迫代替她去往敵國和親泪姨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 整理總結(jié)自《設(shè)計模式之禪》一書 1 單一職責原則 Single Responsibility Principle ...
    笑哥哥閱讀 436評論 0 1
  • 目錄: 設(shè)計模式六大原則(1):單一職責原則 設(shè)計模式六大原則(2):里氏替換原則 設(shè)計模式六大原則(3):依賴倒...
    加油小杜閱讀 719評論 0 1
  • 什么是設(shè)計模式饰抒?設(shè)計模式(Design Pattern)是一套被反復(fù)使用驴娃、多數(shù)人知曉的、經(jīng)過分類的循集、代碼設(shè)計經(jīng)驗的...
    星星_點燈閱讀 395評論 0 0
  • 昨天看了營友晨聽寫的一篇《翻了497人的聊天記錄,我找到了定位的姿勢...》镶柱,特有啟發(fā)旷档。 確實,在一個圈子就得有這...
    莫雨竹morning閱讀 652評論 4 6
  • 7月8日下午歇拆,在戴南鎮(zhèn)黨委委員鞋屈、副鎮(zhèn)長、政法委書記陳長榮同志和鎮(zhèn)慈善會副會長兼秘書長拜磊同志的帶領(lǐng)下故觅,走訪...
    夏所珍創(chuàng)作室閱讀 490評論 0 1