java的依賴倒置原則你了解多少
依賴倒置原則
什么是依賴倒置原則:
高層模塊不應(yīng)該依賴低層模塊,二者都應(yīng)該依賴其抽象
抽象不應(yīng)該依賴細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴抽象
針對接口編程,不要針對實現(xiàn)編程
即:
每個類盡量繼承自接口或者抽象類
優(yōu)點:減少類之間的耦合,提高代碼的穩(wěn)定性,代碼的可讀性維護(hù)性。
案例:
背景:
現(xiàn)在有一個用戶類叫Ggzx(也就是我),想要學(xué)習(xí)一些課程,簡單的來實現(xiàn)調(diào)用學(xué)習(xí)的方法,然后在一個Test類之中輸入學(xué)習(xí)的內(nèi)容。但是我暫時只學(xué)java和web,但是可能我后面還要學(xué)習(xí)Spring,SpringMVC…
1.面向?qū)崿F(xiàn)編程
public class Ggzx { public void stduyJava(){ System.out.println("學(xué)習(xí)了java課程"); } public void studyWeb(){ System.out.println("學(xué)習(xí)了Web課程"); } }
public class Test { public static void main(String[] args) { Ggzx ggzx=new Ggzx(); ggzx.studyJava(); ggzx.studyPython(); ggzx.studyGo(); } }
分析:
上面使用的面向?qū)崿F(xiàn)編程,但是Test作為我們控制的"應(yīng)用層",也就是高層,而Ggzx作為低層,其實這樣在比較簡單的例子中,其實是沒問題的,因為假如不需要擴(kuò)展,僅僅是實現(xiàn)兩個很簡單的功能,并沒有必要去面向接口開發(fā),但是一般在開發(fā)中通常有很復(fù)雜的開發(fā)環(huán)境和開發(fā)需求。
現(xiàn)在如果想添加新的功能,學(xué)習(xí)其他的課程,怎么辦???
繼續(xù)使用面向?qū)崿F(xiàn)編程,直接在 Ggzx 類中直接添加新的方法,可以完成這個功能需求。
用上面的方法實現(xiàn)有沒有缺點???
1.學(xué)習(xí)的課程和 Ggzx 類耦合比較嚴(yán)重。是學(xué)習(xí)的課程只能通過Ggzx 才能得到 。并且是想要學(xué)習(xí)新的課程也要在 Ggzx 類中不斷添加和修改 —>高耦合
2.Ggzx 作為當(dāng)前 demo 的底層,經(jīng)常的被改動,高層Test依賴于低層 Ggzx 的實現(xiàn) ---->對應(yīng)依賴倒置原則中的:高層過度依賴低層了
2.面向接口編程(簡單版)
為了解決上面出現(xiàn)的問題,我們可以考慮把學(xué)習(xí)的課程抽出來成為一個類。到現(xiàn)在,類和類之間的耦合其實就已經(jīng)降低很多了。然后將其當(dāng)做參數(shù)傳入Ggzx里面,然后調(diào)用課程里面的學(xué)習(xí)方法
//web課程類 public class WebCourse { public void studyCourse() { System.out.println("學(xué)習(xí)了Web課程"); } }
//這里是Java課程類 public class JavaCourse { public void studyCourse() { System.out.println("學(xué)習(xí)Java課程"); } }
當(dāng)我們寫出來這兩個類,想要對Ggzx里面的學(xué)習(xí)方法進(jìn)行編寫的時候,有沒有發(fā)現(xiàn)其實有一些小問題呢????
Ggzx里面接收這些類的參數(shù)是什么??
難道要這樣?
//以下是Ggzx類中的內(nèi)容 public void studyJava(JavaCourse javaCourse){ } public void studyWeb(WebCourse webCourse){ }
nonono,如果這樣做,雖然當(dāng)前已經(jīng)把課程類和 Ggzx 用戶剝離一點點了,但是是還是形同虛設(shè),課程類雖然分離開了,但是還是像狗皮膏藥一樣貼在 Ggzx 類中,但是看著還是很難受,高層 Test 調(diào)用方法還是得依賴 Ggzx 里面有什么方法
- 每次加入新課程,都需要修改底層功能
如何修改???
接口是個好東西,課程類之間是不是都包含同樣一個方法,被學(xué)習(xí)的方法( studyCourse ),那么我們可以將所有課程類都實現(xiàn)一個ICourse課程!
對應(yīng)上面的問題,我們該傳入什么參數(shù)能解決問題??可以傳入一個接口
改編后的 UML 圖解展示(Ggzx 被廢棄,用新的 NewGgzx 代替):
(如果沒了解過UML類圖,或者是純小白,只需要知道一個大框是一個類,虛線表示實現(xiàn)了箭頭方向的接口,小m是方法 即可)
觀察上面的UML圖
WebCourse 和 JavaCourse 實現(xiàn)自同一個接口 ICourse,每個課程都有自己的 studyXxx 方法。
這樣好在什么地方?
課程類和Ggzx類是解耦的,無論你增加多少個課程類,只要實現(xiàn)了ICourse接口,都能直接傳入Ggzx的studyMyCourse()方法中
public interface ICourse { void studyCourse(); }
public interface ICourse { void studyCourse(); }
public class NewGgzx { public void studyMyCourse(ICourse iCourse){ iCourse.studyCourse(); } }
上面就是案例的面向接口編程,我們可以看到,在 NewGgzx 類中,我們可以傳入一個實現(xiàn) ICourse 接口的課程類,我們在Test類中調(diào)用的時候,只需要傳入一個課程類即可調(diào)用學(xué)習(xí)方法,這樣當(dāng)想擴(kuò)展新的內(nèi)容,只需要創(chuàng)建一個新的課程類實現(xiàn) ICourse 即可
Test使用
NewGgzx newGgzx =new NewGgzx(); newGgzx.studyMoocCourse(new WebCourse()); newGgzx.studyMoocCourse(new com.ggzx.design.priciple.dependenceiversion.JavaCourse());
從面向?qū)崿F(xiàn)到面向接口,我們處理問題的方法改變了:
- 開始時,我們需要考慮在Test類中調(diào)用Ggzx里面的哪一種學(xué)習(xí)方法,即注重調(diào)用什么方法能夠?qū)崿F(xiàn)特定的課程
- 到面向接口編程,我們考慮傳入什么課程即可實現(xiàn)學(xué)習(xí)
當(dāng)業(yè)務(wù)需求拓展時,拓展方法也改變了:
- 面向?qū)崿F(xiàn):需要改變底層的代碼來協(xié)調(diào)我們需要使用的功能,用上面的例子來解釋就是:當(dāng)你想要學(xué)習(xí)一個課程,你就需要改變你底層的實現(xiàn),增加新的代碼
- 面向接口:想學(xué)習(xí)什么課程,不會對其他課程造成影響,也不會影響到低層的Ggzx 。實際操作就是增加一門新的課程即可,實現(xiàn)接口之后,傳入這個類到Ggzx的方法中就可以學(xué)習(xí)這一門課了
相對于細(xì)節(jié)的多變性,抽象的東西更穩(wěn)定,以抽象為基礎(chǔ)搭建的架構(gòu)比以細(xì)節(jié)搭建的架構(gòu)更加穩(wěn)定
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Java?Web應(yīng)用小案例之實現(xiàn)用戶登錄功能全過程
在Java開發(fā)過程中實現(xiàn)用戶的注冊功能是最基本的,這篇文章主要給大家介紹了關(guān)于Java?Web應(yīng)用小案例之實現(xiàn)用戶登錄功能的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01SpringBoot實現(xiàn)MQTT消息發(fā)送和接收方式
這篇文章主要介紹了SpringBoot實現(xiàn)MQTT消息發(fā)送和接收方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03java實現(xiàn)文件復(fù)制、剪切文件和刪除示例
這篇文章主要介紹了java實現(xiàn)文件復(fù)制、剪切文件和刪除示例,需要的朋友可以參考下2014-04-04Spring MVC中使用Google kaptcha驗證碼的方法詳解
kaptcha 是一個非常實用的驗證碼生成工具。有了它,你可以生成各種樣式的驗證碼,因為它是可配置的,下面這篇文章主要給大家介紹了關(guān)于Spring MVC中使用Google kaptcha驗證碼的方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-10-10解決IDEA創(chuàng)建maven項目時pom.xml沒有變藍(lán)的問題
這篇文章主要介紹了解決IDEA創(chuàng)建maven項目時pom.xml沒有變藍(lán)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08