架构设计之依赖倒置、控制反转与依赖注入
名詞解釋
?
依賴:一種模型元素之間的關(guān)系的描述。例如類A調(diào)用了類B,那么我們說(shuō)類A依賴于類B。
耦合:一種模型元素之間的關(guān)系的描述。例如類A調(diào)用了類B或類B調(diào)用了類A,那么我們說(shuō)類A與類B有耦合關(guān)系。
耦合度:模型元素之間的依賴程度的量化描述。
控制:一種模型元素之間的關(guān)系的描述。例如類A調(diào)用了類B,那么我們說(shuō)類A控制類B。
?
緒論
架構(gòu)設(shè)計(jì)的對(duì)象一般是類庫(kù)、框架和應(yīng)用程序。其工作任務(wù)除了類庫(kù)、框架、應(yīng)用程序各個(gè)模塊(類)之間的關(guān)系設(shè)計(jì)之外,還包括類庫(kù)、框架和應(yīng)用程序三者之間關(guān)系的設(shè)計(jì)。而依賴倒置、控制反轉(zhuǎn)、依賴注入正是常用的一類設(shè)計(jì)模式。
依賴倒置、控制反轉(zhuǎn)、依賴注入三者含義和目標(biāo)基本一致,即通過(guò)抽象接口解耦和消除依賴關(guān)系。
?
依賴倒置
從字面理解依賴倒置往往不知所云,通過(guò)了解其歷史淵源可以很好的消除這種誤解。在面向結(jié)構(gòu)編程時(shí)代,架構(gòu)設(shè)計(jì)師往往采用自上而下的設(shè)計(jì)模式,先設(shè)計(jì)上層模塊,再設(shè)計(jì)下層模塊,如此層層分解,導(dǎo)致上層模塊嚴(yán)重依賴于下層模塊,下層模塊的一點(diǎn)變化都會(huì)導(dǎo)致上層地震。到了面向?qū)ο缶幊虝r(shí)代,架構(gòu)設(shè)計(jì)師使用對(duì)象進(jìn)行設(shè)計(jì),通過(guò)抽象接口解耦各層之間的依賴關(guān)系,為了與面向結(jié)構(gòu)的設(shè)計(jì)模式區(qū)分開,同時(shí)體現(xiàn)面向?qū)ο蟮膬?yōu)勢(shì),也為了嘩眾取寵,就給這種新的設(shè)計(jì)模式起了個(gè)依賴倒置的名稱。
依賴倒置的核心思想是依賴于抽象。
依賴倒置的原則是上層模塊不依賴于下層模塊,而是依賴于一套抽象接口,上層模塊調(diào)用接口,下層模塊實(shí)現(xiàn)接口。以類庫(kù)和應(yīng)用程序?yàn)槔?#xff0c;我們把應(yīng)用程序需要調(diào)用的功能抽象為一組接口,然后由類庫(kù)實(shí)現(xiàn)這組接口,那么應(yīng)用程序就可以使用任意實(shí)現(xiàn)了該接口的類庫(kù),從而和類庫(kù)解耦。
?
控制反轉(zhuǎn)
控制反轉(zhuǎn)的來(lái)歷與依賴倒置相似,以前設(shè)計(jì)應(yīng)用程序,雖然會(huì)引用類庫(kù),但一切都在應(yīng)用程序的控制之中。后來(lái)根據(jù)應(yīng)用程序的不同場(chǎng)景,人們?cè)O(shè)計(jì)了相應(yīng)的框架,有了框架之后,再設(shè)計(jì)應(yīng)用程序時(shí),就變成了為框架增加自定義行為的設(shè)計(jì),控制權(quán)轉(zhuǎn)到了框架手里,因此說(shuō)控制權(quán)反轉(zhuǎn)了。
控制反轉(zhuǎn)是依賴倒置的一種具體實(shí)現(xiàn),強(qiáng)調(diào)的是控制流程的依賴倒置,是框架設(shè)計(jì)的必用模式。框架基于依賴倒置模式設(shè)計(jì):對(duì)于框架中不確定的部分,框架抽象出一組接口,并依賴于這組接口進(jìn)行實(shí)現(xiàn),應(yīng)用程序?qū)崿F(xiàn)這組接口。
?
依賴注入
依賴注入也是依賴倒置的一種具體實(shí)現(xiàn),是類庫(kù)設(shè)計(jì)的一種常用模式。類庫(kù)中的類基于依賴模式設(shè)計(jì):某類依賴于接口,而不是具體的實(shí)現(xiàn),由調(diào)用者在調(diào)用時(shí)傳入這些接口的具體實(shí)現(xiàn)類。
.Net中廣泛使用此模式,比如StreamReader類,當(dāng)使用StreamReader時(shí),需要實(shí)例化一個(gè)Stream或其派生類,傳給StreamReader的構(gòu)造函數(shù),然后方能使用該類的方法。
?
弊病
依賴倒置的基礎(chǔ)是假設(shè)抽象是穩(wěn)定的。對(duì)于我們已經(jīng)了解的事物,當(dāng)然可以實(shí)現(xiàn)很好的抽象,但對(duì)于尚未認(rèn)識(shí)清楚的事物,比如用戶需求,就很難保證這個(gè)抽象的穩(wěn)定性。因此一旦這個(gè)抽象穩(wěn)定的假設(shè)不成立,那么依賴倒置不但不能發(fā)揮優(yōu)勢(shì),反倒可能成為包袱。
?
【轉(zhuǎn)載】http://www.cnblogs.com/luckdv/archive/2011/07/21/2112767.html
?
轉(zhuǎn)載于:https://www.cnblogs.com/julin-peng/p/5434099.html
總結(jié)
以上是生活随笔為你收集整理的架构设计之依赖倒置、控制反转与依赖注入的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: vsftpd的基于pam_mysql的虚
- 下一篇: Samsung Pay体验札记:或推支付