詳解Java設(shè)計模式編程中的依賴倒置原則
定義:
高層模塊不應(yīng)該依賴低層模塊,二者都應(yīng)該依賴其抽象;抽象不應(yīng)該依賴細(xì)節(jié);細(xì)節(jié)應(yīng)該依賴抽象。
問題由來:類A直接依賴類B,假如要將類A改為依賴類C,則必須通過修改類A的代碼來達(dá)成。這種場景下,類A一般是高層模塊,負(fù)責(zé)復(fù)雜的業(yè)務(wù)邏輯;類B和類C是低層模塊,負(fù)責(zé)基本的原子操作;假如修改類A,會給程序帶來不必要的風(fēng)險。
解決方案:將類A修改為依賴接口I,類B和類C各自實現(xiàn)接口I,類A通過接口I間接與類B或者類C發(fā)生聯(lián)系,則會大大降低修改類A的幾率。
依賴倒置原則基于這樣一個事實:相對于細(xì)節(jié)的多變性,抽象的東西要穩(wěn)定的多。以抽象為基礎(chǔ)搭建起來的架構(gòu)比以細(xì)節(jié)為基礎(chǔ)搭建起來的架構(gòu)要穩(wěn)定的多。在java中,抽象指的是接口或者抽象類,細(xì)節(jié)就是具體的實現(xiàn)類,使用接口或者抽象類的目的是制定好規(guī)范和契約,而不去涉及任何具體的操作,把展現(xiàn)細(xì)節(jié)的任務(wù)交給他們的實現(xiàn)類去完成。
依賴倒置原則的核心思想是面向接口編程,我們依舊用一個例子來說明面向接口編程比相對于面向?qū)崿F(xiàn)編程好在什么地方。場景是這樣的,母親給孩子講故事,只要給她一本書,她就可以照著書給孩子講故事了。
例子:
違法依賴倒置的情況
public class Student { public void read(Book book){ System.out.println("學(xué)生開始閱讀:"+book.getName()); } } public class Book { public String getName() { return "書籍"; } }
當(dāng)學(xué)生需要閱讀網(wǎng)頁時,就需要修改Student類,這是很不友好的設(shè)計。下面我們看遵守依賴倒置原則的例子。
public interface Person { public void read(Reader reader); } public interface Reader { public String getName(); } public class Student implements Person{ @Override public void read(Reader reader) { System.out.println("學(xué)生開始閱讀:"+reader.getName()); } } public class Book implements Reader { public String getName() { return "書籍"; } } public class Website implements Reader { public String getName() { return "網(wǎng)頁"; } } public class Test { public static void main(String[] args) { Person student = new Student(); student.read(new Book()); student.read(new Website()); } }
在read方法中我們使用了接口作為參數(shù)。
總結(jié):
1. 每個類最好有接口或者抽象類,或者同時接口和抽象類都有。
2. 變量聲明最好是接口或者抽象類。
3. 繼承時遵守里氏替換原則。
相關(guān)文章
關(guān)于easyExcel中讀取Excel表頭的實例說明
EasyExcel是阿里巴巴開源的一個excel處理框架,以使用簡單、節(jié)省內(nèi)存著稱,下面這篇文章主要給大家介紹了關(guān)于easyExcel中讀取Excel表頭的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06詳解Spring Cloud Netflix Zuul中的速率限制
這篇文章主要介紹了詳解Spring Cloud Netflix Zuul中的速率限制,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11spring中IOC控制反轉(zhuǎn)依賴注入和new對象的區(qū)別說明
這篇文章主要介紹了spring中IOC控制反轉(zhuǎn)依賴注入和new對象的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02Java數(shù)據(jù)結(jié)構(gòu)之圖的原理與實現(xiàn)
圖(Graph)是由頂點的有窮非空集合和頂點之間邊的集合組成,通常表示為:G(V,E),其中,G表示一個圖,V是圖G中頂點的集合,E是圖G中邊的集合。本文將詳細(xì)介紹圖的原理及其代碼實現(xiàn),需要的可以參考一下2022-01-01