依賴倒置原則的定義
依賴倒置原則(dependence inversion principle,dip)是 object mentor 公司總裁羅伯特·馬丁(robert c.martin)於 1996 年在 c++ report 上發表的文章。
依賴倒置原則的原始定義為:高層模組不應該依賴低層模組,兩者都應該依賴其抽象;抽象不應該依賴細節,細節應該依賴抽象(high level modules shouldnot depend upon low level modules.both should depend upon abstractions.abstractions should not depend upon details. details should depend upon abstractions)。其核心思想是:要面向介面程式設計,不要面向實現程式設計。
依賴倒置原則是實現開閉原則的重要途徑之一,它降低了客戶與實現模組之間的耦合。
由於在軟體設計中,細節具有多變性,而抽象層則相對穩定,因此以抽象為基礎搭建起來的架構要比以細節為基礎搭建起來的架構要穩定得多。這裡的抽象指的是介面或者抽象類,而細節是指具體的實現類。
使用介面或者抽象類的目的是制定好規範和契約,而不去涉及任何具體的操作,把展現細節的任務交給它們的實現類去完成。
依賴、倒置原則的作用
依賴倒置原則的主要作用如下。
依賴倒置原則的實現方法
依賴倒置原則的目的是通過要面向介面的程式設計來降低類間的耦合性,所以我們在實際程式設計中只要遵循以下4點,就能在專案中滿足這個規則。
每個類盡量提供介面或抽象類,或者兩者都具備。
變數的宣告型別盡量是介面或者是抽象類。
任何類都不應該從具體類派生。
使用繼承時盡量遵循黎克特制替換原則。
下面以「顧客購物程式」為例來說明依賴倒置原則的應用。
【例1】依賴倒置原則在「顧客購物程式」中的應用。
分析:本程式反映了 「顧客類」與「商店類」的關係。商店類中有 sell() 方法,顧客類通過該方法購物以下**定義了顧客類通過韶關** shaoguanshop 購物:
class customer}
但是,這種設計存在缺點,如果該顧客想從另外一家商店(如婺源** wuyuanshop)購物,就要將該顧客的**修改如下:
class customer}
顧客每更換一家商店,都要修改一次**,這明顯違背了開閉原則。存在以上缺點的原因是:顧客類設計時同具體的商店類繫結了,這違背了依賴倒置原則。解決方法是:定義「婺源**」和「韶關**」的共同介面 shop,顧客類面向該介面程式設計,其**修改如下:
class customer}
這樣,不管顧客類 customer 訪問什麼商店,或者增加新的商店,都不需要修改原有**了,其類圖如圖 1 所示。
圖1 顧客購物程式的類圖
程式**如下:
package principle;public class diptest}//商店inte***ce shop//韶關**class shaoguanshop implements shop }//婺源**class wuyuanshop implements shop} //顧客class customer}
程式的執行結果如下:
顧客購買以下商品:韶關土特產:香菇、木耳……婺源土特產:綠茶、酒糟魚……
物件導向設計原則 依賴倒置原則
依賴倒置原則 dependence inversion principle,dip 依賴倒置原則的原始定義為 高層模組不應該依賴低層模組,兩者都應該依賴其抽象 抽象不應該依賴細節,細節應該依賴抽象。其核心思想是 要面向介面程式設計,不要面向實現程式設計。依賴倒置原則是實現開閉原則的重要途徑之一,它降...
物件導向設計原則之4 依賴倒置原則
依賴倒置原則 dependence inversion principle or dip 該文章的最新版本已遷移至個人部落格 位元飛 單擊鏈結 訪問。高層模組不應該依賴低層模組,他們都應該依賴於抽象 抽象不應該依賴於細節,細節應該依賴於抽象。簡單的定義為 面向介面 抽象 程式設計,不要面向實現程式設...
物件導向原則 依賴倒置原則
我寫這個自然段的時候,還沒有具體的看依賴倒置的含義。也就是不知者,不知者就算理解錯了也無罪哈哈。我現在有三個疑問,何為依賴,何為倒置 因為我感覺這個名字起得,有點讓人不太好理解!依賴為何倒置?目前在我看來,依賴關係,是乙個物件作為另乙個類的某個方法的引數,那麼他倆是依賴關係。那麼倒置是什麼含義?與我...