首頁 >Java >java教程 >Java中關於依賴倒轉原則的實例詳解

Java中關於依賴倒轉原則的實例詳解

黄舟
黄舟原創
2017-08-11 10:12:091845瀏覽

這篇文章主要介紹了Java依賴倒轉原則的定義及問題由來解決方案,有興趣的朋友一起看看吧

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

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

解決方案:將類別A修改為依賴介面I,類別B和類別C各自實作介面I,類別A透過介面I間接與類別B或類別C發生聯繫,則會大幅降低修改類A的幾率。

         依賴倒置原則是基於這樣一個事實:相對於細節的多變性,抽象的東西要穩定的多。以抽象為基礎搭建起來的架構比以細節為基礎建構起來的架構要穩定的多。在Java中,抽象指的是介面或抽象類,細節就是具體的實作類,使用介面或抽象類別的目的是製定好規範和契約,而不去涉及任何具體的操作,把展現細節的任務交給他們的實作類別去完成。

         依賴倒置原則的核心思想是面向介面編程,我們依舊有一個例子來說明面向介面程式比相對於面向實作程式好在什麼地方。場景是這樣的,母親給孩子講故事,只要給她一本書,她就可以照著書給孩子講故事了。程式碼如下:


class Book{ 
 public String getContent(){ 
  return "很久很久以前有一个阿拉伯的故事……"; 
 } 
} 
class Mother{ 
 public void narrate(Book book){ 
  System.out.println("妈妈开始讲故事"); 
  System.out.println(book.getContent()); 
 } 
} 
public class Client{ 
 public static void main(String[] args){ 
  Mother mother = new Mother(); 
  mother.narrate(new Book()); 
 } 
}

運行結果:

#媽媽開始講故事

##很久很久以前有一個阿拉伯的故事…

        運作良好,假如有一天,需求變成這樣:不是給書而是給一份報紙,讓這位母親講一下報紙上的故事,報紙的代號如下:


class Newspaper{ 
 public String getContent(){ 
  return "林书豪38+7领导尼克斯击败湖人……"; 
 } 
}

        這位母親卻辦不到,因為她居然不會讀報紙上的故事,這太荒唐了,只是將書換成報紙,居然必須要修改Mother才能唸。如果以後需求換成雜誌呢?換成網頁呢?還要不斷地修改​​Mother,這顯然不是好的設計。原因就是Mother與Book之間的耦合性太高了,必須降低他們之間的耦合度才行。


我們引入一個抽象的介面IReader。讀物,只要是帶字的都屬於讀物:


interface IReader{ 
 public String getContent(); 
} 
Mother类与接口IReader发生依赖关系,而Book和Newspaper都属于读物的范畴,他们各自都去实现IReader接口,这样就符合依赖倒置原则了,代码修改为:
class Newspaper implements IReader { 
 public String getContent(){ 
  return "林书豪17+9助尼克斯击败老鹰……"; 
 } 
} 
class Book implements IReader{ 
 public String getContent(){ 
  return "很久很久以前有一个阿拉伯的故事……"; 
 } 
} 
class Mother{ 
 public void narrate(IReader reader){ 
  System.out.println("妈妈开始讲故事"); 
  System.out.println(reader.getContent()); 
 } 
} 
public class Client{ 
 public static void main(String[] args){ 
  Mother mother = new Mother(); 
  mother.narrate(new Book()); 
  mother.narrate(new Newspaper()); 
 } 
}

運行結果:

媽媽開始講故事很久很久以前有一個阿拉伯的故事…
媽媽開始說故事

林書豪17+9助尼克斯擊敗老鷹…   

這樣修改之後,無論以後怎樣擴展Client類,都不需要再修改Mother類了。這只是一個簡單的例子,實際情況中,代表高層模組的Mother類別將負責完成主要的業務邏輯,一旦需要對它進行修改,引入錯誤的風險極大。所以遵循依賴倒置原則可以降低類別之間的耦合性,提高系統的穩定性,降低修改程序造成的風險。


採用依賴倒置原則為多人並行開發帶來了極大的便利,例如上例中,原本Mother類別與Book類別直接耦合時,Mother類別必須等Book類別編碼完成後才可以進行編碼,因為Mother類別依賴Book類別。修改後的程式則可以同時開工,互不影響,因為Mother與Book類一點關係也沒有。參與協作開發的人越多、專案越龐大,採用依賴導致原則的意義就越重大。現在很流行的TDD開發模式就是依賴倒置原則最成功的應用。


傳遞依賴關係有三種方式,以上的例子中使用的方法是介面傳遞,另外還有兩種傳遞方式:建構方法傳遞和setter方法傳遞,相信用過Spring框架的,對依賴的傳遞方式一定不會陌生。

在實際程式設計中,我們一般需要做到如下3點:

  • 低層模組盡量都要有抽象類別或接口,或是兩者都有。

  • 變數的宣告類型盡量是抽象類別或介面。

  • 使用繼承時遵循里氏替換原則。

        依賴倒置原則的核心是我們要面對介面編程,也瞭解了面向介面編程,也理解了依賴倒置。

以上是Java中關於依賴倒轉原則的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn