設計原則之依賴倒置原則


定義:高層模塊不應該依賴低層模塊,二者都應該依賴其抽象;抽象不應該依賴細節;細節應該依賴抽象。

問題:類A直接依賴類B,假如要將類A改為依賴類C,則必須通過修改類A的代碼來達成。這種場景下,類A一般是高層模塊,
負責復雜的業務邏輯;類B和類C是低層模塊,負責基本的原子操作;假如修改類A,會給程序帶來不必要的風險。

解決:將類A修改為依賴接口I,類B和類C各自實現接口I,類A通過接口I間接與類B或者類C發生聯系,則會大大降低修改類A的幾率。

舉個栗子:講一個讀者讀書的故事。。。

1. 新建一個類Book,包含獲取書的內容的方法,代碼如下:

2. 新建一個類Reader,依賴類Book,包含一個讀書的read方法,代碼如下:

3. 在類DIPFragment中,通過類Reader的對象調用read方法來實現讀者讀書的功能,代碼如下:

4. 運行后的效果是:

 

      以上,就實現了一個讀者讀書的故事。現在要改需求,我們不讀書了,改讀報紙了,那么我們要新建一個報紙類Newspaper,同樣包含一個獲取報紙的內容的方法,然后去修改讀者類Reader,替換掉類Book,又去修改實現類DIPFragment,這樣是不是覺得改動的地方太多了,跟重新寫無異,試想一下,如果原有的功能比較復雜的話,那樣再進行需求變動,要做的工作是很多的,原因就是Reader與Book的耦合性太高,所以必須降低他倆之間的耦合度才行,於是我們可以引入抽象的接口IRead,包含一個獲取讀物內容的getReadContent方法,具體實現如下:


1. 新增一個抽象的接口IRead,包含一個獲取讀物內容的getReadContent方法,代碼如下:

2. 新增一個報紙類Newspaper,實現接口IRead;同樣讓類Book也去實現接口IRead。代碼如下:

3. 讓高層模塊去依賴接口,即類Reader依賴接口IRead,它負責完成主要的具體的業務邏輯。代碼如下:

4. 在類DIPFragment中,通過類Reader的對象調用read方法來實現讀者讀書的功能,代碼如下:

5. 運行后的效果是:

 

      以上就是采用的依賴倒置原則,降低了Reader和Book、Newspaper之間的耦合性,無論以后怎樣擴展DIPFragment類,都不需要再修改Reader類了,給多人並行開發帶來了極大的便利,Reader和Book、Newspaper可以同時開工,互不影響,這樣也就提高了系統的穩定性,降低了修改程序造成的風險。

 

原則:面向接口編程。抽象指的是接口或抽象類,細節就是具體的實現類,使用接口或者抽象類的目的是制定好規范和契約,
而不去涉及任何具體的操作,把展現細節的任務交給他們的實現類去完成。

注意:
1. 在代碼中傳遞參數或關聯關系時,盡量引用高層的抽象層類,即使用接口和抽象類進行變量聲明、參數類型聲明、
方法返回類型聲明以及數據類型的轉換;
2. 當一個對象和其他對象有依賴關系時,可以利用依賴注入的方法將類之間進行解耦,主要有:構造注入、Set方法注入
和接口注入;
3. 開閉是原則,里氏是基礎,依賴倒置是手段;
4. 低層模塊盡量都要有抽象類或接口,或者兩者都有;
5. 變量的聲明類型盡量是抽象類或接口;
6. 使用繼承時遵循里氏替換原則。

好處:
1. 可降低類之間的耦合性;
2. 可提高系統的穩定性;
3. 可降低修改程序所造成的風險。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM