依賴倒置原則(Dependence Inversion Principle,DIP),其原始的定義是:High level modules should not depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details.Details should depend upon abstractions.編程
翻譯過來,包含三層含義:函數
● 高層模塊不該該依賴低層模塊,二者都應該依賴其抽象;翻譯
● 抽象不該該依賴細節;對象
● 細節應該依賴抽象。繼承
高層模塊和低層模塊容易理解,每個邏輯的實現都是由原子邏輯組成的,不可分割的 原子邏輯就是低層模塊,原子邏輯的再組裝就是高層模塊。那什麼是抽象?什麼又是細節 呢?在Java語言中,抽象就是指接口或抽象類,二者都是不能直接被實例化的;細節就是實 現類,實現接口或繼承抽象類而產生的類就是細節,其特色就是能夠直接被實例化,也就是 能夠加上一個關鍵字new產生一個對象。接口
依賴倒置原則在Java語言中的表現就是: ip
● 模塊間的依賴經過抽象發生,實現類之間不發生直接的依賴關係,其依賴關係是經過 接口或抽象類產生的; ci
● 接口或抽象類不依賴於實現類;io
● 實現類依賴接口或抽象類。變量
更加精簡的定義就是「面向接口編程」——OOD(Object-Oriented Design,面向對象設 計)的精髓之一。
依賴的三種寫法:
構造函數傳遞依賴對象
Setter方法傳遞依賴對象
接口聲明依賴對象(也稱接口注入)
依賴倒置原則的本質就是經過抽象(接口或抽象類)使各個類或模塊的實現彼此獨立, 不互相影響,實現模塊間的鬆耦合,咱們怎麼在項目中使用這個規則呢?只要遵循如下的幾 個規則就能夠:
每一個類儘可能都有接口或抽象類,或者抽象類和接口二者都具有
變量的表面類型儘可能是接口或者是抽象類
任何類都不該該從具體類派生
儘可能不要覆寫基類的方法
結合里氏替換原則使用