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