摘要:引述最近看設(shè)計模式以及代碼,對于控制反轉(zhuǎn)以及依賴注入這些概念非常困惑,于是找了一些資料,以下是對于控制反轉(zhuǎn)的一下理解。其中最常見的方式叫做依賴注入,簡稱,還有一種方式叫依賴查找。在軟件工程中,依賴注入是種實現(xiàn)控制反轉(zhuǎn)用于解決依賴性設(shè)計模式。
引述
最近看設(shè)計模式以及l(fā)aravel代碼,對于控制反轉(zhuǎn)以及依賴注入這些概念非常困惑,于是找了一些資料,以下是對于控制反轉(zhuǎn)的一下理解。
概念 IoC控制反轉(zhuǎn)(Inversion of Control,縮寫為IoC),是面向?qū)ο缶幊讨械囊环N設(shè)計原則,可以用來減低計算機代碼之間的耦合度。它把傳統(tǒng)上由程序代碼直接操控的對象的調(diào)用權(quán)交給容器,通過容器來實現(xiàn)對象組件的裝配和管理。所謂的“控制反轉(zhuǎn)”概念就是對組件對象控制權(quán)的轉(zhuǎn)移,從程序代碼本身轉(zhuǎn)移到了外部容器。其中最常見的方式叫做依賴注入(Dependency Injection,簡稱DI),還有一種方式叫“依賴查找”(Dependency Lookup)。通過控制反轉(zhuǎn),對象在被創(chuàng)建的時候,由一個調(diào)控系統(tǒng)內(nèi)所有對象的外界實體,將其所依賴的對象的引用傳遞給它。也可以說,依賴被注入到對象中。
正如概念中描述的,那么控制反轉(zhuǎn)具體指哪些 控制 被 反轉(zhuǎn) 了呢,其實我理解的控制反轉(zhuǎn)是指程序所控制的對象的控制權(quán)交給了容器,而這個容器就是實現(xiàn)各個模塊解耦合的關(guān)鍵。IoC只是一種設(shè)計思想,主要實現(xiàn)有:
依賴查找(Dependency Lookup):容器提供回調(diào)接口和上下文環(huán)境給組件。
依賴注入(Dependency Injection)
我們著重說一下依賴注入。
DI在軟件工程中,依賴注入是種實現(xiàn)控制反轉(zhuǎn)用于解決依賴性設(shè)計模式。一個依賴關(guān)系指的是可被利用的一種對象(即服務(wù)提供端) 。依賴注入是將所依賴的傳遞給將使用的從屬對象(即客戶端)。該服務(wù)是將會變成客戶端的狀態(tài)的一部分。 傳遞服務(wù)給客戶端,而非允許客戶端來建立或?qū)ふ曳?wù),是本設(shè)計模式的基本要求。
以上是wikipedia上對于依賴注入的理解,下面將用實際的例子詳細講解。
舉例加入我們設(shè)計一個通用的用戶登錄基類,可以支持多個平臺的用戶登錄
那么最糟糕的寫法是,
/** * A類用戶登錄 **/ class User_A_Login { public function checkALogin(){ }; } /** * B類用戶登錄 **/ class User_B_Login { public function checkBLogin(){ }; } /** * 登錄基類 **/ class User_Login { public function checkLogin($userType) { if($userType = "A"){ $this->objAUser = new User_A_Login(); $this->objAUser->checkALogin(); }elseif($userType = "B"){ $this->objBUser = new User_B_Login(); $this->objBUser->checkBLogin(); } } }
上面的 User_Login 這個類就直接依賴于類 User_A_Login 和 User_B_Login ,如果我們使用下面這種方式寫
interface User_Login_Interface { public function checkLogin(); } /** * A類用戶登錄 **/ class User_A_Login implements User_Login_Interface { public function checkLogin(){ }; } /** * B類用戶登錄 **/ class User_B_Login implements User_Login_Interface { public function checkLogin(){ }; } /** * 登錄基類 **/ class User_Login { public $userLogin; public function setUser(User_Login_Interface $user){ $this->userLogin = $user; } public function checkLogin() { $this->userLogin->checkLogin(); } }
如果按照這種方式進行構(gòu)建代碼,我們將依賴項User_B_Login或者User_A_Login通過函數(shù) setUser( ) 注入到類中,調(diào)用方式:
$userLogin = new User_Login(); $userLogin->setUser(new User_A_Login); $userLogin->checkLogin();
調(diào)用方可以控制使用那個登錄類型,這就完成了對于不同登錄系統(tǒng)的依賴注入。如果你引入了一個新的用戶c,只需寫一個c的登錄類:
/** * C類用戶登錄 **/ class User_C_Login implements User_Login_Interface { public function checkLogin(){ }; }
就可以通過:
$userLogin = new User_Login(); $userLogin->setUser(new User_C_Login); $userLogin->checkLogin();
進行登錄驗證了。在實際代碼中由于基類非常復(fù)雜需要對登錄做一系列處理,所以每次添加登錄用戶不應(yīng)該去修改基類。對于一下框架例如laravel的框架是不能修改的,應(yīng)該就是通過這種方式實現(xiàn)的調(diào)用方的自定義。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/28774.html
摘要:本文一大半內(nèi)容都是通過舉例來讓讀者去理解什么是控制反轉(zhuǎn)和依賴注入,通過理解這些概念,來更加深入。這種由外部負責(zé)其依賴需求的行為,我們可以稱其為控制反轉(zhuǎn)。工廠模式,依賴轉(zhuǎn)移當(dāng)然,實現(xiàn)控制反轉(zhuǎn)的方法有幾種。 容器,字面上理解就是裝東西的東西。常見的變量、對象屬性等都可以算是容器。一個容器能夠裝什么,全部取決于你對該容器的定義。當(dāng)然,有這樣一種容器,它存放的不是文本、數(shù)值,而是對象、對象的描...
摘要:對象之間耦合度過高的系統(tǒng),必然會出現(xiàn)牽一發(fā)而動全身的情形??刂票环崔D(zhuǎn)之后,獲得依賴對象的過程由自身管理變?yōu)榱擞扇萜髦鲃幼⑷搿S谑?,他給控制反轉(zhuǎn)取了一個更合適的名字叫做依賴注入。 Spring還可以這么學(xué)--IoC(控制反轉(zhuǎn)) / DI(依賴注入)理解 聲明:文章的前三部分參考博文:https://www.cnblogs.com/Nouno...這篇文章首發(fā)是在我的個人微信訂閱號每天學(xué)編...
摘要:劃下重點,服務(wù)容器是用于管理類的依賴和執(zhí)行依賴注入的工具。類的實例化及其依賴的注入,完全由服務(wù)容器自動的去完成。 本文首發(fā)于 深入剖析 Laravel 服務(wù)容器,轉(zhuǎn)載請注明出處。喜歡的朋友不要吝嗇你們的贊同,謝謝。 之前在 深度挖掘 Laravel 生命周期 一文中,我們有去探究 Laravel 究竟是如何接收 HTTP 請求,又是如何生成響應(yīng)并最終呈現(xiàn)給用戶的工作原理。 本章將帶領(lǐng)大...
摘要:學(xué)習(xí)總結(jié)學(xué)習(xí)整理的一些筆記,很簡單。大部分認為和只是不同的叫法而已。依賴注入的兩種方式和注解使用注釋驅(qū)動的功能源碼剖析 Spring IoC學(xué)習(xí)總結(jié) 學(xué)習(xí)spring Ioc整理的一些筆記,很簡單。分享給大家。 IoC 基本概念 在這之前,我們先記住一句話。好萊塢原則:Dont call us, we will call you.其實這句話很恰當(dāng)?shù)匦稳萘朔崔D(zhuǎn)的意味;Ioc, Inve...
閱讀 816·2021-11-11 16:54
閱讀 3172·2021-09-26 09:55
閱讀 2068·2021-09-07 10:20
閱讀 1280·2019-08-30 10:58
閱讀 1111·2019-08-28 18:04
閱讀 775·2019-08-26 13:57
閱讀 3666·2019-08-26 13:45
閱讀 1223·2019-08-26 11:42