Java面向對象設計原則3——依賴倒置原則

在我們學習面向對象編程的時候,總會出現一些問題,好比以前剛剛寫好的代碼,上線測試可以、正常運行,突然有一天說要加一個功能,改完之後,發現以前正常運行的功能不能用了,類似這樣的問題有好多好多,爲了避免類似的事件發生,程序員一定要根據這些原則去開發程序。

我們一個一個來學習,今天來學習7大面向對象設計原則之一,依賴倒置原則。

依賴倒置原則:

依賴倒置原則(Dependence Inversion Principle,DIP)是 Object Mentor 公司總裁羅伯特·馬丁(Robert C.Martin)於 1996 年在 C++ Report 上發表的文章。

依賴倒置原則的定義爲:高層模塊不應該依賴低層模塊,兩者都應該依賴其抽象;抽象不應該依賴細節,細節應該依賴抽象(High level modules shouldnot depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details. Details should depend upon abstractions)。

一定要好好讀讀這句話,最起碼得讀個七八遍。

依賴倒置原則和里氏替換原則一樣,都是更加詳細的補充了開閉原則。而依賴倒置原則主要的目的是:降低耦合度。

還有一個就是其他博客中沒有提到的,依賴不能顛倒,不能下層的代碼依賴上層,只能是上層代碼依賴下層!下層在做改變的時候,通過接口去改變,直接改變的話會導致上層也不穩定,最後結果就是代碼整體崩塌。

何爲上層代碼、何爲下層代碼:

可能這個名字不是特別專業,但是主要的是這個意思。

下層代碼好比說是輸出一句話,上層代碼進行調用,並且成功輸出。

但是如果下層代碼調用上層的一個服務要獲取一個固定值輸出,那麼,這個就是不對的。

高內聚低耦合:

說到這裏我們來說一個我們常說的一句話:高內聚,低耦合。

我們先來解釋前面三個字,高內聚。

內聚指的是從功能的角度來度量模塊內的聯繫,一個內聚的模塊應該只做好一件事。高內聚,就是說將模塊只對外暴露最小限度的接口,形成最低的依賴關係。修改模塊裏的內容,只對和它有依賴的模塊產生影響, 對其他的模塊沒有任何影響。

而且,類與類之間的關係一定要簡單,明瞭,不要有很強的關係,不然,運行起來就會出問題,不能說該了一個類,另外一個調用它的類就不能正常調用了。

由於高內聚具備可靠性,可重用性,可讀性等優點,模塊設計推薦採用高內聚。

然後我們再來解釋後三個字,低耦合。

耦合指的是兩個類,或者兩個模塊的關聯程度,關聯的越複雜、這個程序的耦合度也就越高。

這麼去說,如果模塊間聯繫越多,其耦合性越強,同時表明其獨立性越差,這樣的會導致,改了接口中的一段代碼之後,另外的一段代碼開始報錯,類似於這樣的情況,在我們平時開發的時候是經常遇見的。

依賴倒置原則的作用:

知道了依賴倒置原則要解決的東西,我們也就能知道它的作用。

1.降低類與類之間的耦合性。

2.能夠提高系統運行的穩定性。

3.可以提高代碼的可讀性。

如何去實現:

要想實現這個依賴倒置原則,我們可以通過面向接口編程來降低類與類之間的耦合度。

我們舉一個例子:

就用吃飯來說,今天你媽包了餃子,吃蒸餃

public void eatDumplings(Dumplings dumpling){
    System.out.println("我今天吃的是"+dumpling.getName);
}

好,今天吃的蒸餃。

第二天呢,你媽說包餃子太費事了,準備換一個吃,準備吃麪條。但是你只有吃餃子的方法,怎麼去吃麪條???

很簡單,該代碼,將今天吃的餃子的代碼換成麪條。

但問題來了,不能每天都去更換代碼啊,不能說吃一種東西就得換一下代碼。

問題出現的原因:

首先,這個代碼違背了開閉原則,根本代碼沒有複用性。而出現了這個問題的原因是,沒有面向接口去編程,而是面向實現去編程。

解決方案就是,定一個主食類,讓所有每天吃的東西去繼承它,這樣就可以做到,不管你媽做啥你都能吃到了,也不用費勁的去改代碼了。

 

要想學會這個依賴倒置原則就一定要記住!面向接口去編程,不要爲了實現功能而去拋棄接口!

發佈了33 篇原創文章 · 獲贊 33 · 訪問量 1622
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章