1、什么是依賴倒轉(zhuǎn)原則?
所謂依賴倒置原則,就是不論高層組件和低層組件都應(yīng)該依賴于抽象,而不是具體實(shí)現(xiàn)類。聽(tīng)起來(lái)更像是“針對(duì)接口編程,而不是針對(duì)實(shí)現(xiàn)編程”,但是這里依賴倒置原則更強(qiáng)調(diào)“抽象”的概念,不要讓高層組件依賴低層組件,更不能依賴具體實(shí)現(xiàn)類,都要依賴于抽象。依賴倒置原則的核心在于“面向接口編程”,目的在于“解耦”。
2、這里的倒置是什么意思呢?
依賴倒置原則中的倒置是指我們的思想要和一般的“自頂向下”結(jié)構(gòu)化設(shè)計(jì)思想相反。面向過(guò)程的設(shè)計(jì)方法是從頂端分析,然后到實(shí)現(xiàn)類,例如,簡(jiǎn)單工廠模式中我們讓工廠生產(chǎn)產(chǎn)品,但是又不想讓工廠和具體實(shí)現(xiàn)類存在任何關(guān)系,否則就對(duì)具體實(shí)現(xiàn)類產(chǎn)生了依賴,這是我們不希望看到的結(jié)果。這時(shí)候我們就應(yīng)該將思想倒置一下,不要從頂端開始,我們從具體的實(shí)現(xiàn)類開始,看看能夠抽象出什么,然后一切都依賴抽象來(lái)進(jìn)行,這樣就與我們的目標(biāo)相近了。
3、為什么有依賴倒轉(zhuǎn)原則?
在面向過(guò)程中,往往是高層組件調(diào)用低層組件,這樣,高層組件就會(huì)依賴于低層組件,當(dāng)?shù)蛯咏M件發(fā)生劇烈變動(dòng)時(shí),高層組件也要跟著變動(dòng),就會(huì)倒置模塊的復(fù)用性大大降低,并且大大提高開發(fā)成本,增加了軟件擴(kuò)展、維護(hù)的復(fù)雜度。如下為面向過(guò)程的軟件開發(fā)調(diào)用圖:
由圖可以看出,高層組件調(diào)用低層組件,即高層組件依賴于低層組件,當(dāng)?shù)蛯咏M件發(fā)生變化時(shí),勢(shì)必會(huì)對(duì)高層組件產(chǎn)生影響。
那么我們應(yīng)該怎樣改變這種情況呢?應(yīng)用依賴倒轉(zhuǎn)原則可以解決這個(gè)問(wèn)題,即面向接口編程。讓我們的程序依賴于抽象,實(shí)現(xiàn)的細(xì)節(jié)也依賴于抽象。即使實(shí)現(xiàn)細(xì)節(jié)不斷變動(dòng),只要抽象不變,客戶程序就不需要變化。這大大降低了客戶程序與實(shí)現(xiàn)細(xì)節(jié)之間的耦合度。面向接口示意圖如下:
這樣,無(wú)論低層組件怎樣變化,只要抽象組件不發(fā)生變化,高層組件就不會(huì)發(fā)生變化,實(shí)現(xiàn)了客戶程序與實(shí)現(xiàn)細(xì)節(jié)的解耦。
4、舉例說(shuō)明依賴倒置原則?
(1)不符合依賴倒轉(zhuǎn)原則的類圖
在這幅類圖中,動(dòng)物工廠(高層組件)生產(chǎn)貓和狗(貓狗具體類屬于低層組件)時(shí)就要去調(diào)用貓和狗的構(gòu)造方法,當(dāng)我想增加生產(chǎn)魚的功能時(shí),就要增加魚類,還要修改動(dòng)物工廠類,這就違背了開閉原則。造成這種情況的原因就是因?yàn)閯?dòng)物工廠過(guò)于依賴具體動(dòng)物類。
?。?)符合依賴倒轉(zhuǎn)原則的類圖
在這幅類圖中,動(dòng)物工廠(高層組件)生產(chǎn)貓和狗(貓狗具體類屬于低層組件)時(shí)依然需要調(diào)用貓和狗的構(gòu)造方法,但這時(shí)候因?yàn)橹虚g增加了抽象組件,我要增加生產(chǎn)魚的功能的時(shí)候只要增加魚類和魚工廠就行了,而不需要去修改已有的類。這符合開閉原則,增加了程序的可擴(kuò)展性和可維護(hù)性。
小結(jié):依賴倒置原則中的”倒置“說(shuō)的是要和面向過(guò)程的思想倒置,用面向?qū)ο蟮乃枷肴ピO(shè)計(jì)程序。值得注意的是,面向?qū)ο笫且环N思想,而不是說(shuō)用了面向?qū)ο蟮木幊陶Z(yǔ)言,用類和對(duì)象寫代碼就是面向?qū)ο罅耍灰獟熘泵嫦驅(qū)ο蟆暗难蝾^,賣著”面向過(guò)程“的狗肉。只要開發(fā)程序,就要奔著將軟件做成一個(gè)易擴(kuò)展的、能夠適應(yīng)需求變化的軟件,這是我們一直追求的。