控制反轉(zhuǎn)和依賴注入

  • 看標(biāo)題覺得很牛逼, 等我講完你就理解了, 面向?qū)ο笾泻芎唵蔚臇|西。

  • 控制反轉(zhuǎn)也叫l(wèi)oC, 全稱Inverse of Control。

  • 控制反轉(zhuǎn)包括依賴注入(DI)和依賴查找(DL), 但我們大多數(shù)情況都認(rèn)為loC就是DI。全稱分別為: Dependency Injection和Dependency Lookup。

  • loC原理也叫做依賴倒置原理, 全稱Dependency Inversion Principle。

  • 這里必須說明一下, loC是一種全新的設(shè)計(jì)模式。但Gof的23種設(shè)計(jì)模式中并沒有l(wèi)oC是因?yàn)榭刂品崔D(zhuǎn)思想成熟較晚。

  • JAVA體系中Spring框架的核心就是依賴注入, 其他語言的各種框架也都會用到這種設(shè)計(jì)模式。

  • A類用于查詢數(shù)據(jù)庫記錄, B類用于連接數(shù)據(jù)庫, 也就是說A依賴于B, 現(xiàn)在我們怎么在A類中書寫查詢方法呢?(為什么不在A中連接數(shù)據(jù)庫?如果你有一百個(gè)A, 你連接一百次, new一百個(gè)對象實(shí)例出來嗎?這是需要內(nèi)存和IO開銷的!B類只負(fù)責(zé)數(shù)據(jù)庫鏈接, 還要封裝工廠單例適配器模式, 內(nèi)容并不少哦)

  • 單一功能原則是面向?qū)ο蟮幕驹瓌t之一, 也是GOF中設(shè)計(jì)模式的基本原則之一。全稱single responsibility principle。

  • 我們的A類實(shí)體控制內(nèi)部所有資源對象, 我們在其參數(shù)上將B類的引用寫上(注入, 類的引用即類的實(shí)例化對象), A的內(nèi)部就可以使用B中的方法, 這就是依賴注入。

  • 也就是說, 控制反轉(zhuǎn)是,關(guān)于一個(gè)對象如何獲取他所依賴的對象的引用, 這個(gè)責(zé)任的反轉(zhuǎn)。這個(gè)對象不局限于我上面寫的類, 如果是A函數(shù)注入B函數(shù), 其實(shí)就類似于回調(diào)了。

  • 什么叫責(zé)任的反轉(zhuǎn)?一開始是A對象在內(nèi)部程序代碼中實(shí)例化B, 實(shí)例化這個(gè)操作的責(zé)任在內(nèi)部; 依賴注入后我都在自己的內(nèi)部當(dāng)你實(shí)例化了, 真正的實(shí)例化操作由容器負(fù)責(zé), 容器的參數(shù)注入實(shí)例化對象, 這就是責(zé)任反轉(zhuǎn)。

  • 依賴注入主要是用來解開對象之間的緊密耦合關(guān)系, 解耦是面向?qū)ο蟮幕驹瓌t之一。

  • 面向?qū)ο蟛坏貌惶峤涌?Interface), 接口是必須被實(shí)現(xiàn)的, new一個(gè)接口A的一瞬間, A接口和實(shí)現(xiàn)A接口的B類之間, 依賴(耦合)關(guān)系就產(chǎn)生了。

  • A與B之間有依賴關(guān)系。如果想使用接口A的另外一個(gè)實(shí)現(xiàn)就需要更改代碼了。當(dāng)然我們可以建立一個(gè)Factory工廠類來根據(jù)條件生成想要的A接口的的具體實(shí)現(xiàn), 這里不解釋工廠模式了。

  • 工廠模式確實(shí)看起來有點(diǎn)用, 但實(shí)際上對耦合狀態(tài)并沒有改變,因?yàn)檫@只是在工廠中加判斷語句做分流處理。loC則是將依賴問題交給實(shí)現(xiàn)類, 可以用于徹底解決依賴問題。

  • 在JAVA體系中, loC是依賴于反射編程的, 反射就是根據(jù)類名來生成對象。反射這種操作比直接new生成對象的效率要低很多, 但是提高了系統(tǒng)的可維護(hù)性和靈活性。對于某些生成要求高的對象不聯(lián)系使用loC。

  • JAVA中使用loC反射編程, IDE不方便自動查找重構(gòu), 必須開發(fā)者手動修改XML配置文件。

  • JAVA中的loC容器: Pico Container、Avalon 、Spring、JBoss、HiveMind、EJB等。php中的loC容器可以是任何一個(gè)函數(shù)或者接口的實(shí)現(xiàn)類。

  • 不知道各位能理解多少, 整理一下自己的學(xué)習(xí)筆記。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容