依賴倒置原則(Dependence Inversion Principle):
1、高層子產品不應該依賴底層子產品,二者都應該依賴抽象。
2、抽象不應該依賴細節,細節應該依賴抽象。
3、依賴倒置的中心思想是面向接口程式設計。
4、依賴倒置原則是基于這樣的設計理念:相對于細節的多變性,抽象的東西要穩定的多。以抽象為基礎搭建的架構比以細節為基礎搭建的架構要穩定的多。
5、使用接口或抽象類的目的是指定好規範,而不涉及任何具體的操作,把展現細節的任務交給他們的實作類來完成。
經典案例:
三二班有個小明,想要學習C#,于是買了本《深入了解C#》進行學習。

view code
過了一段時間,小明覺得光學習一門太沒有意思了。聽說Linux比較好玩,于是買了本《鳥哥的私房菜Linux》。

小明是一個聰明的娃,過了一段時間學得差不多了,于是又想學習《設計模式》...就這樣小明在不斷學習中成長,而我們的代碼卻越來越臃腫,變得難以維護。由于XiaoMing是一個進階子產品并且是一個細節實作類,此類依賴了書籍CSharp和Linux又是一個細節依賴類,這導緻XiaoMing每讀一本書都需要修改代碼,這與我們的依賴倒置原則是相悖的。那如何解決XiaoMing的這種問題呢?

我們發現,隻要讓XiaoMing依賴于抽象IBook,其他書籍依賴于該抽象,以後不管小明讀什麼書,哈哈都是so easy的。
依賴關系傳遞的三種方式:
1、通過接口傳遞(上述示例)

2、通過構造方法傳遞

3、通過Setter方法傳遞

依賴倒置原則的本質就是通過抽象(接口或抽象類)使各個類或子產品的實作彼此獨立,不互相影響,實作子產品間的松耦合。我們在項目中使用這個原則要遵循下面的規則:
1、每個類盡量都有接口或者抽象類,或者抽象類和接口兩都具備
2、變量的表面類型盡量是接口或者抽象類
3、任何類都不應該從具體類派生
4、盡量不要覆寫基類的方法
5、如果基類是一個抽象類,而這個方法已經實作了,子類盡量不要覆寫。類間依賴的是抽象,覆寫了抽象方法,對依賴的穩定性會有一定的影響
6、結合裡氏替換原則使用