设计模式之依赖倒置原则
文章目錄
- 依賴倒置原則(Dependence Inversion Principle, DIP)
- 代碼實現(xiàn)
- 總結(jié):
依賴倒置原則(Dependence Inversion Principle, DIP)
依賴倒置原則即要依賴于抽象,不依賴于實現(xiàn)。
- 高層模塊不應(yīng)該依賴低層模塊,兩者都應(yīng)該依賴其抽象
- 抽象不應(yīng)該依賴細節(jié)
- 細節(jié)應(yīng)該依賴抽象
代碼實現(xiàn)
依賴倒置在java中的實現(xiàn):比如一位媽媽要給孩子講故事
public class Book {public String getContext(){return "從前有座山。。。。。";} } public class Mother {public void tell(Book book){System.out.print("mom開始講故事:");System.out.println(book.getContext());} } public class Child {public static void main(String[] args) {Mother mother = new Mother();mother.tell(new Book());} }如果我們把書換成日記,報紙之類的,發(fā)現(xiàn)媽媽居然讀不了日記或報紙,想讓媽媽讀報紙必須得改變媽媽的代碼,這顯然是不合理的
public class Diary {public String getContext(){return "日記:今天是xxxxx";} }新增一個接口,讀物IReader,書籍、日記、報紙等可以讀的東西都實現(xiàn)讀物接口
public interface IReader {/*** 獲取所讀的內(nèi)容* @return*/public String getContext(); }改動后的Mother類
public class Mother {public void tell(IReader reader){//只要拿到讀物的實現(xiàn)類,不管是新聞還是什么,都可以讀System.out.print("mom開始講");System.out.println(reader.getContext());} }將之前的Book類和Diary類都實現(xiàn)讀物接口
public class Book implements IReader{@Overridepublic String getContext() {return "故事書:從前有座山,。。。。。";} } public class Diary implements IReader{@Overridepublic String getContext() {return "日記:今天是xxxx";} }再想讓媽媽讀報紙,只需實現(xiàn)讀物IReader接口即可
public class NewsPaper implements IReader{@Overridepublic String getContext() {return "報紙:北約停止東擴,烏蘇關(guān)系降溫";} }這樣修改之后,無論Child做什么改動,都不需要修改Mother類中的內(nèi)容,
測試:
實際開發(fā)中,Mother類代表高層類,負責(zé)完成主要的業(yè)務(wù)邏輯,如果修改錯誤的風(fēng)險極大。開始寫的程序Mother依賴于Book類,耦合性較高,是不可取的,Mother必須在Book類加載后才能閱讀。
修改后的程序,Mother和Book類、Diary類都是沒有聯(lián)系的。這就是依賴倒置原則的使用,可以降低類之間的耦合性,提高系統(tǒng)的穩(wěn)定性,降低修改程序造成的風(fēng)險。
實際編程中一般需做到如下3點:
- 低層模塊盡量都要有抽象類或接口,或者兩者都有
- 變量的聲明類型盡量是抽象類和接口
- 使用繼承時遵循里氏代換原則
總結(jié):
IReader相當(dāng)于基類,IReader出現(xiàn)的地方都可以用實現(xiàn)子類去替換它,這就是里氏代換原則(Liskov Substitution Principle LSP),任何基類可以出現(xiàn)的地方,子類一定可以出現(xiàn)。
里氏代換原則是依賴倒置原則的基礎(chǔ),依賴倒置原則的核心就是要面向接口編程,理解了面向接口編程,也就理解了依賴倒置。
總結(jié)
以上是生活随笔為你收集整理的设计模式之依赖倒置原则的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机组成原理-检错码、纠错码
- 下一篇: 详解AST抽象语法树