這篇文章主要介紹了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之間的耦合性太高了,必須降低他們之間的耦合度才行。
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助尼克斯擊敗老鷹…
在實際程式設計中,我們一般需要做到如下3點:
以上是Java中關於依賴倒轉原則的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!