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