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