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