4.依赖倒置原则
文章目錄
- 一、定義
- 二、常見的系統(tǒng)模塊設計
- 三、依賴導致原則分析
- 四、依賴倒置原則修改系統(tǒng)結構
- 五、依賴注入
- 1.依賴注入的方式
- (1)構造注入
- (2)設值注入
- (3)接口注入
- 六、依賴倒置原則實例
- 1、存在問題
- 2、依賴倒置原則重構
一、定義
??(1)高層模塊不應該依賴低層模塊,它們都應該依賴抽象;抽象不應該依賴于細節(jié),細節(jié)應該依賴于抽象。無論是高層模塊還是低層模塊,都應該依賴于抽象。
??另外一種表述:要針對接口編程,不要針對實現(xiàn)編程。實現(xiàn)指的是具體的類,是不穩(wěn)定的。
??(2)結構良好的面向對象架構都具有清晰的層次定義,每個層次通過一個定義良好的、受控的接口向外提供一組內聚的服務。
二、常見的系統(tǒng)模塊設計
??一般認為系統(tǒng)的結構是:高層的調用低層的,低層的再調用更低層的,如下圖:
??Policy Layer:決策層
??Mechanism Layer:機制層
??Utility Layer:工具層
??這樣看起來似乎是正確的,但是高層對低層的改動是敏感的。低層發(fā)生改變了,比如低層的方法名,參數改變。會導致中層發(fā)生改變,接著導致高層發(fā)生改變。
三、依賴導致原則分析
??(1)簡單來說,依賴倒置原則就是指:代碼要依賴于抽象的類,而不要依賴于具體的類;要針對接口或抽象類編程,而不是針對具體類編程。
??(2)更好的描述是:不要依賴那些容易變化的具體類。如果要繼承一個類,從一個抽象類繼承;如果要持有一個類的引用,從一個抽象類引用;如果要調用一個函數,從一個抽象的函數調用。
??什么是依賴,只要 A類 和 B類 發(fā)生了關系,那么它們就存在了依賴關系。就比如說 A類調用了B類中的方法,那么就可以說A依賴于B。這里的依賴是泛指的。
??(3)實現(xiàn)開閉原則的關鍵是抽象化,并且從抽象化導出具體化實現(xiàn),如果說開閉原則是面向對象設計的目標,那么依賴倒置原則就是主要手段。
??(4)依賴倒置原則的常用實現(xiàn)方式之一是在代碼中使用抽象類,而將具體類放在配置文件中。
如下圖:
??(5)依賴倒置原則主要解決的是類之間的耦合關系,對類進行解耦。
??類之間的耦合關系大致為:
??1)零耦合:兩個類是獨立的,沒有關系
??2)具體耦合關系:兩個類發(fā)生了關系并且都是具體的類
??3)抽象耦合關系
??依賴倒置原則要求客戶端依賴于抽象耦合,以抽象方式耦合是依賴倒置原則的關鍵。
??比如,服務端C 經常要調用服務端S 提供的服務,如果S是抽象的是允許的,如果是具體的類是不允許的(這種關系是不穩(wěn)定的)。
四、依賴倒置原則修改系統(tǒng)結構
??(1)之前的系統(tǒng)結構是高層的模塊通過調用低層的模塊,模塊之間的相互調用來來完成系統(tǒng)的功能設計。但是這樣的設計是存在問題的,低層發(fā)生改變,高層也得發(fā)生改變。
??(2)用依賴倒置原則進行改進:之前的模塊(類)之間的關系是具體的耦合關系,要改進的話在兩個模塊之間增加一個抽象的層,通常是增加抽象的接口。
??這樣高層依賴的是抽象的接口,低層去實現(xiàn)接口
五、依賴注入
??依賴注入是為了更好地實現(xiàn)依賴倒置的配套技術。依賴注入是什么?
??如下圖,A依賴于抽象的C,B依賴于抽象C;而A需要的是具體的B,也就是說要把具體的B傳給A,怎么把具體的B傳給A呢?這就是涉及到依賴注入。
或者說,A依賴于抽象的接口C,在具體的運行中,要給A具體的類,具體的類如何傳給A,用什么方式。
1.依賴注入的方式
(1)構造注入
??通過構造函數注入實例變量。
(2)設值注入
??通過 Setter 方法注入實例變量。這個方法最常用
(3)接口注入
??通過接口方法注入實例變量。
六、依賴倒置原則實例
??某系統(tǒng)提供一個數據轉換模塊,可以將來自不同數據源的數據轉換成多種格
式,如可以轉換來自數據庫的數據(DatabaseSource)、也可以轉換來自文本文件的數據(TextSource),轉換后的格式可以是XML文件(XMLTransformer)、也可以是 XLS文件(XLSTransformer) 等。
1、存在問題
??現(xiàn)在 MainClass 依賴的四個模塊都是具體的
??由于需求的變化,該系統(tǒng)可能需要增加新的數據源或者新的文件格式,每增加一個新的類型的數據源或者新的類型的文件格式,客戶類MainClass都需要修改源代碼,以便使用新的類,但違背了開閉原則。
2、依賴倒置原則重構
??現(xiàn)使用依賴倒置原則對其進行重構,存在的問題就是 MainClass 依賴的四個模塊都是具體的,具體的東西是不穩(wěn)定的。解決的思路就是將具體的模塊抽象化,讓 MainClass 依賴的是抽象的東西。
總結
- 上一篇: URL长链转短链
- 下一篇: 人工智能识别手写数学公式