设计模式之控制反转和依赖注入的使用小结
控制反轉(zhuǎn)
控制反轉(zhuǎn)是一種思想,Inversion of Control,縮寫為IoC,是面向?qū)ο缶幊讨械囊环N設(shè)計原則,可以用來減低計算機(jī)代碼之間的耦合度。參考
為什么要用控制反轉(zhuǎn)的思想
主要是為了高內(nèi)聚、低耦合
高內(nèi)聚
模塊內(nèi)部要高度聚合
低耦合
模塊和模塊之間的耦合度要盡量低
高耦合的問題 - 依賴過多
從圖中可以看到,軟件中的對象就像齒輪一樣,協(xié)同工作,但是互相耦合,一個零件不能正常工作,整個系統(tǒng)就崩潰了。這是一個強(qiáng)耦合的系統(tǒng)。齒輪組中齒輪之間的嚙合關(guān)系,與軟件系統(tǒng)中對象之間的耦合關(guān)系非常相似。對象之間的耦合關(guān)系是無法避免的,也是必要的,這是協(xié)同工作的基礎(chǔ)。現(xiàn)在,伴隨著工業(yè)級應(yīng)用的規(guī)模越來越龐大,對象之間的依賴關(guān)系也越來越復(fù)雜,經(jīng)常會出現(xiàn)對象之間的多重依賴性關(guān)系,因此,架構(gòu)師和設(shè)計師對于系統(tǒng)的分析和設(shè)計,將面臨更大的挑戰(zhàn)。對象之間耦合度過高的系統(tǒng),必然會出現(xiàn)牽一發(fā)而動全身的情形。
Apple apple;public AppleX(){apple = new Apple(); } //AppleX對Apple有依賴 //如果new Apple()很慢的話,單測就很困難 //Apple的創(chuàng)造方式發(fā)生變化,比如說,Apple(String version)高耦合的解決 - 控制反轉(zhuǎn)
為了解決對象間耦合度過高的問題,軟件專家Michael Mattson提出了IOC理論,用來實現(xiàn)對象之間的“解耦”。
控制反轉(zhuǎn)(Inversion of Control)是一種是面向?qū)ο缶幊讨械囊环N設(shè)計原則,用來減低計算機(jī)代碼之間的耦合度。其基本思想是:借助于“第三方”實現(xiàn)具有依賴關(guān)系的對象之間的解耦。
Dependency injection是控制反轉(zhuǎn)的一種技術(shù),簡而言之,就是不經(jīng)過自己初始化依賴,而通過外部(第三方)來傳入依賴的方式。
實例的創(chuàng)建工作交給容器來完成
由于引進(jìn)了中間位置的“第三方”,也就是IOC容器,使得A、B、C、D這4個對象沒有了耦合關(guān)系,齒輪之間的傳動全部依靠“第三方”了,全部對象的控制權(quán)全部上繳給“第三方”IOC容器,所以,IOC容器成了整個系統(tǒng)的關(guān)鍵核心,它起到了一種類似“粘合劑”的作用,把系統(tǒng)中的所有對象粘合在一起發(fā)揮作用,如果沒有這個“粘合劑”,對象與對象之間會彼此失去聯(lián)系,這就是有人把IOC容器比喻成“粘合劑”的由來。
Dependency injection(依賴注入)
Apple apple;public AppleX(Apple apple){this.apple = apple; } //Apple 已經(jīng)在外部初始化Inject現(xiàn)實例子
一個人(Java實例,調(diào)用者)需要一把斧子(Java實例,被調(diào)用者)。
(1)原始社會里,幾乎沒有社會分工。需要斧子的人(調(diào)用者)只能自己去磨一把斧子(被調(diào)用者)。對應(yīng)的情形為:Java程序里的調(diào)用者自己創(chuàng)建被調(diào)用者。
(2)進(jìn)入工業(yè)社會,工廠出現(xiàn)。斧子不再由普通人完成,而在工廠里被生產(chǎn)出來,此時需要斧子的人(調(diào)用者)找到工廠,購買斧子,無須關(guān)心斧子的制造過程。對應(yīng)Java程序的簡單工廠的設(shè)計模式。
(3)進(jìn)入“按需分配”社會,需要斧子的人不需要找到工廠,坐在家里發(fā)出一個簡單指令:需要斧子。斧子就自然出現(xiàn)在他面前。對應(yīng)Spring的依賴注入。
第一種情況下,Java實例的調(diào)用者創(chuàng)建被調(diào)用的Java實例,必然要求被調(diào)用的Java類出現(xiàn)在調(diào)用者的代碼里。無法實現(xiàn)二者之間的松耦合。
第二種情況下,調(diào)用者無須關(guān)心被調(diào)用者具體實現(xiàn)過程,只需要找到符合某種標(biāo)準(zhǔn)(接口)的實例,即可使用。此時調(diào)用的代碼面向接口編程,可以讓調(diào)用者和被調(diào)用者解耦,這也是工廠模式大量使用的原因。但調(diào)用者需要自己定位工廠,調(diào)用者與特定工廠耦合在一起。
第三種情況下,調(diào)用者無須自己定位工廠,程序運(yùn)行到需要被調(diào)用者時,系統(tǒng)自動提供被調(diào)用者實例。事實上,調(diào)用者和被調(diào)用者都處于Spring的管理下,二者之間的依賴關(guān)系由Spring提供。
所謂依賴注入,是指程序運(yùn)行過程中,如果需要調(diào)用另一個對象協(xié)助時,無須在代碼中創(chuàng)建被調(diào)用者,而是依賴于外部的注入。Spring的依賴注入對調(diào)用者和被調(diào)用者幾乎沒有任何要求,完全支持對POJO之間依賴關(guān)系的管理。
想要看到更多瑋哥的學(xué)習(xí)筆記、考試復(fù)習(xí)資料、面試準(zhǔn)備資料?想要看到IBM工作時期的技術(shù)積累和國外初創(chuàng)公司的經(jīng)驗總結(jié)?
敬請關(guān)注:
瑋哥的博客 —— CSDN的傳送門
瑋哥的博客 —— 簡書的傳送門
瑋哥的博客 —— 博客園的傳送門
瑋哥的博客 —— 51Testing的傳送門
轉(zhuǎn)載于:https://www.cnblogs.com/vigorz/p/10501927.html
總結(jié)
以上是生活随笔為你收集整理的设计模式之控制反转和依赖注入的使用小结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2019年春季学期第二周作业
- 下一篇: asp.net ajax控件工具集 Au