摘要:什么是依賴注入依賴倒置原則高層模塊不應(yīng)該依賴于低層模塊,兩個(gè)都應(yīng)該依賴于抽象接口。而依賴倒置原則的思想是,上層不應(yīng)該依賴下層,應(yīng)依賴接口。當(dāng)然依賴倒置原則也始終貫徹在里面。
什么是依賴注入(Dependency Injection)
依賴倒置原則:高層模塊不應(yīng)該依賴于低層模塊,兩個(gè)都應(yīng)該依賴于抽象(接口)。
依賴倒置是一種軟件設(shè)計(jì)思想,在傳統(tǒng)軟件中,上層代碼依賴于下層代碼,當(dāng)下層代碼有所改動(dòng)時(shí),上層代碼也要相應(yīng)進(jìn)行改動(dòng),因此維護(hù)成本較高。而依賴倒置原則的思想是,上層不應(yīng)該依賴下層,應(yīng)依賴接口。意為上層代碼定義接口,下層代碼實(shí)現(xiàn)該接口,從而使得下層依賴于上層接口,降低耦合度,提高系統(tǒng)彈性。
舉個(gè)栗子:小霸王游戲機(jī)// 如果使用單純的面向?qū)ο髞?lái)寫(xiě) class XiaoBaWang { private $game; public function loadGame() { $this->game = new HunDouLuo(); $this->game->play(); } } class HunDouLuo{ public function play() { //玩游戲 } } $machine = new XiaoBaWang(); $machine->loadGame(); class XiaoBaWang { private $game; public function loadGame() { $this->game = new Tank(); $this->game->play(); } } class Tank { public function play() { //玩游戲 } } $reg = new XiaoBaWang(); $reg->loadGame();使用依賴注入的寫(xiě)法
小霸王游戲機(jī):插拔式卡帶
interface Game { public function play(); } class HunDouLuo implements Game { public function play() { // 玩魂斗羅 } } class Tank implements Game { public function play() { // 坦克大戰(zhàn) } } class XiaoBaWang { private $game; public function __construct(Game $game) { $this->game = $game; } public function loadGame() { $this->game->play(); } } $hunDouLuo = new HunDouLuo(); $tank = new Tank(); $machine = new XiaoBaWang($hunDouLuo); $machine->loadGame(); $machine = new XiaoBaWang($tank); $machine->loadGame();
上例就使用了"注入"這個(gè)思想,就像注射器一樣將一個(gè)類的實(shí)例注入到另一個(gè)類的實(shí)例中去,需要用什么就注入什么。當(dāng)然"依賴倒置原則"也始終貫徹在里面。"注入"不僅可以通過(guò)構(gòu)造函數(shù)注入,也可以通過(guò)屬性注入,上面你可以可以通過(guò)一個(gè)"set"來(lái)動(dòng)態(tài)為"game"這個(gè)屬性賦值。ioc容器
不過(guò)開(kāi)發(fā)中會(huì)有這樣的經(jīng)歷,一開(kāi)始類比較少,慢慢的功能越來(lái)越多,人員越來(lái)越多,編寫(xiě)了很多類,要使用這個(gè)類必須先引入那個(gè)類,而且一定要確保順序正確。 于是。。。。 就出現(xiàn)了這樣的情況, “a 依賴于b, b 依賴于c, c 依賴于 d, d 依賴于e”, 要獲取‘a(chǎn)’的實(shí)例,你必須依次引入 ‘e,d,c,b’然后依次進(jìn)行實(shí)例化。維護(hù)成本上升,開(kāi)發(fā)成本上升,大家都是接盤(pán)俠。再舉一個(gè)栗子:游戲平臺(tái)steam/battle
如果沒(méi)有游戲平臺(tái),幾個(gè)好友想要聯(lián)機(jī)打魔獸爭(zhēng)霸,我們過(guò)去是怎么做的?Steam/battle游戲平臺(tái)做了什么?
1.每個(gè)人首先一起下載相同版本的游戲
2.安裝驅(qū)動(dòng)程序
3.建立/進(jìn)入 局域互聯(lián)網(wǎng)絡(luò)
4.關(guān)閉防火墻
5.建房間,進(jìn)入房間,開(kāi)始游戲
如果我們玩了一段時(shí)間,想換星際爭(zhēng)霸玩,那我們需要再來(lái)一次以上步驟。
最終,我們玩游戲這個(gè)動(dòng)作是依賴于前面很多步驟的,如果有一步出了錯(cuò),那么久不能正常開(kāi)始游戲。
當(dāng)我們?cè)谟螒蚱脚_(tái)上面要一起玩一款游戲時(shí),我們只需要:
1.下載安裝游戲平臺(tái)
2.選擇一款游戲使用平臺(tái)一鍵安裝
3.開(kāi)始游戲
這時(shí),如果我們要換一款游戲,只需要換個(gè)游戲平臺(tái)一鍵安裝,然后開(kāi)始游戲,不需要擔(dān)心和理會(huì)之前安裝的游戲和開(kāi)始游戲流程對(duì)新游戲有什么影響。
有了以上的思路,我們就可以建一個(gè)steam類和游戲類了...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/28437.html
摘要:依賴注入容器管理應(yīng)用程序中的全局對(duì)象包括實(shí)例化處理依賴關(guān)系。為了解決這樣的問(wèn)題,我們?cè)俅位氐饺肿?cè)表創(chuàng)建組件。參考文章程序員如何理解依賴注入容器補(bǔ)充很多代碼背后,都是某種哲學(xué)思想的體現(xiàn)。 思想 思想是解決問(wèn)題的根本思想必須轉(zhuǎn)換成習(xí)慣構(gòu)建一套完整的思想體系是開(kāi)發(fā)能力成熟的標(biāo)志——《簡(jiǎn)單之美》(前言) . 成功的軟件項(xiàng)目就是那些提交產(chǎn)物達(dá)到或超出客戶的預(yù)期的項(xiàng)目,而且開(kāi)發(fā)過(guò)程符合時(shí)間和費(fèi)...
摘要:在構(gòu)造函數(shù)中注入依賴性在中作為服務(wù)的控制器這是痛苦的,當(dāng)你有個(gè)以上的依賴項(xiàng),你的構(gòu)造函數(shù)是行樣板代碼在屬性中注入依賴性這是我們建議的解決方案。 PHP-DI是用PHP編寫(xiě)的、強(qiáng)大的和實(shí)用的、框架無(wú)關(guān)的依賴注入容器。這是一個(gè)關(guān)于如何使用PHP-DI和依賴注入的最佳實(shí)踐指南。 文章來(lái)源于PHP-DI,作者:Matthieu Napoli和貢獻(xiàn)者。PHP-DI是用PHP編寫(xiě)的、強(qiáng)大的和實(shí)用的...
摘要:代碼這就是控制反轉(zhuǎn)模式。是變量有默認(rèn)值則設(shè)置默認(rèn)值是一個(gè)類,遞歸解析有默認(rèn)值則返回默認(rèn)值從容器中取得以上代碼的原理參考官方文檔反射,具有完整的反射,添加了對(duì)類接口函數(shù)方法和擴(kuò)展進(jìn)行反向工程的能力。 PHP程序員如何理解依賴注入容器(dependency injection container) 背景知識(shí) 傳統(tǒng)的思路是應(yīng)用程序用到一個(gè)Foo類,就會(huì)創(chuàng)建Foo類并調(diào)用Foo類的方法,假如這...
摘要:對(duì)象之間耦合度過(guò)高的系統(tǒng),必然會(huì)出現(xiàn)牽一發(fā)而動(dòng)全身的情形??刂票环崔D(zhuǎn)之后,獲得依賴對(duì)象的過(guò)程由自身管理變?yōu)榱擞扇萜髦鲃?dòng)注入。于是,他給控制反轉(zhuǎn)取了一個(gè)更合適的名字叫做依賴注入。 Spring還可以這么學(xué)--IoC(控制反轉(zhuǎn)) / DI(依賴注入)理解 聲明:文章的前三部分參考博文:https://www.cnblogs.com/Nouno...這篇文章首發(fā)是在我的個(gè)人微信訂閱號(hào)每天學(xué)編...
摘要:依賴注入控制反轉(zhuǎn)的一種具體實(shí)現(xiàn)方法。接下來(lái),我們使用依賴注入實(shí)現(xiàn)控制反轉(zhuǎn),使依賴關(guān)系倒置依賴被動(dòng)傳入。從單元測(cè)試的角度看,依賴注入更方便和操作,方便了測(cè)試人員寫(xiě)出質(zhì)量更高的測(cè)試代碼。 前言 好的設(shè)計(jì)會(huì)提高程序的可復(fù)用性和可維護(hù)性,也間接的提高了開(kāi)發(fā)人員的生產(chǎn)力。今天,我們就來(lái)說(shuō)一下在很多框架中都使用的依賴注入。 一些概念 要搞清楚什么是依賴注入如何依賴注入,首先我們要明確一些概念。 D...
閱讀 3824·2021-11-24 10:23
閱讀 2832·2021-09-06 15:02
閱讀 1346·2021-08-23 09:43
閱讀 2416·2019-08-30 15:44
閱讀 3113·2019-08-30 13:18
閱讀 837·2019-08-23 16:56
閱讀 1807·2019-08-23 16:10
閱讀 606·2019-08-23 15:08