摘要:服務本省作為一個高層類,對外提供訪問,卻受制于提供具體服務的服務提供者定義的實現,高層模塊依賴底層模塊實現,違背了依賴倒置原則。遵循依賴倒置原則的例子場景同介紹中場景。
1. 名詞介紹
2. 組成部分OOD,面向對象設計
DIP,依賴倒置(軟件設計原則)
IOC,控制反轉(軟件設計模式)
DI,依賴注入
IOC Container,控制反轉容器,也是依賴注入容器
2. 依賴倒置原則(DIP) 2.0 介紹服務清單(功能清單,service list)
服務(高層類,service ,對外提供服務)
服務提供者(底層類,service provider ,實際提供服務的對象)
依賴倒置原則,它轉換了依賴,高層模塊不依賴于低層模塊的實現,而低層模塊依賴于高層模塊定義的接口
詳細介紹請點我
2.1 場景描述提供一個計算機儲存的服務。需要根據不同的用戶需求,使用不同的存儲設備。
2.2 沒有遵循依賴倒置原則的例子 2.2.1 定義好服務提供者(實際提供服務)// 定義一個 硬盤存儲類 (服務提供者) class HardDiskStorage { public function saveToHardDisk(){ } public function readFromHardDisk(){ } } // 定義一個 U盤存儲類(服務提供者) class UStorage { public function saveToU(){ } public function readFromU(){ } }2.2.2 定義 服務(對外提供服務的對象)
/** * 定義一個 ComputerStorage 類(存儲服務) */ // 第一種:使用硬盤作為提供實際服務的對象 class ComputerStorage { protected $_storage = null; function __construct(){ $this->_storage = new HardDiskStorage(); } public function save(){ $this->_storage->saveToHardDisk(); } public function read(){ $this->_storage->readFromHardDisk(); } } // 第二種:使用 U 盤作為提供實際服務的對象 class ComputerStorage { protected $_storage = null; function __construct(){ $this->_storage = new UStorage(); } public function save(){ $this->_storage->saveToU(); } public function read(){ $this->_storage->readFromU(); } } // 讀取 $cs = new ComputerStorage(); $cs->read();2.2.3 代碼分析
根據上面的代碼,當切換服務提供者時,服務類的代碼需要做較多的改動。服務(ComputerStorage)本省作為一個高層類,對外提供訪問,卻受制于提供具體服務的服務提供者(HardDiskStorage、UStorage)定義的實現(saveToHardDisk、saveToU、readFromHardDisk、readFromU),高層模塊依賴底層模塊實現,違背了依賴倒置原則。
2.3 遵循依賴倒置原則的例子 2.3.1 場景同 2.1 介紹中場景。
2.3.2 定義服務清單(高層模塊定義接口)interface ServiceList { public function save(); public function read(); }2.3.3 定義服務提供者
// 硬盤 class HardDiskStorage implements ServiceList { public function save(){ } public function read(){ } } // U 盤 class UStorage implements ServiceList { public function save(){ } public function read(){ } }2.3.4 定義服務
class ComputerStorage { protected $_storage = null; function __construct(){ $this->_storage = new HardDiskStorage(); } public function save(){ $this->_storage->save(); } public function read(){ $this->_storage->read(); } } $cs = new ComputerStorage(); $cs->read();2.3.5 代碼分析
上述代碼中,事先定義了好了服務清單(接口,ServiceList),然后服務提供者實現這些接口(HardDiskStorage、UStorage),服務(ComputerStorage)只需要切換服務提供者即可(HardDiskStorage、UStorage),完全無需理會他們的實現(readFromHardDisk、readFromU...等)。高層模塊不依賴于底層模塊定義的實現,遵循了依賴倒置原則
3. 控制反轉(IOC) + 依賴注入(DI) 3.0 介紹控制反轉(IoC),它為相互依賴的組件提供抽象,將依賴(低層模塊)對象的獲得交給第三方(系統)來控制,即依賴對象不在被依賴模塊的類中直接通過new來獲取
詳細介紹請點我
3.1 場景同 2 場景
3.2 沒有實現控制反轉的例子2 中的例子就是沒有實現控制反轉的例子。2 中 ComputerStorage 獲取依賴(HardDiskStorage 或 UStorage)的途徑都是在 contruct 構造函數中獲取的,即 類內部實例化依賴獲取。
3.3 實現控制反轉的例子以下代碼是根據 2 中的代碼做了些許的調整。
class ComputerStorage { protected $_storage = null; /** * 內部只獲取依賴的實例 */ public function setStorage($storage){ $this->_storage = $storage; } public function save(){ $this->_storage->save(); } public function read(){ $this->_storage->read(); } } // 外部實例化依賴 $hardDiskStorage = new HardDiskStorage(); $cs = new ComputerStorage(); // 注入依賴 $cs->setStorage($hardDiskStorage);4. 依賴注入容器(IOC 容器) 4.0 場景
同 2 場景。
4.1 使用 IOC容器class Container { // 注冊表 protected static $_registry = null; // 保存到注冊表 public static function set($classname , Callable $create){ self::$_registry[$classname] = $create; } // 獲取注冊表對應類的實例 public static function get($key){ call_user_func(self::$_registry[$key]); } } class ComputerStorage { protected $_storage = null; function __construct(){ $this->_storage = Container::get("HardDiskStorage"); } public function read(){ $this->_storage->read(); } public function save(){ $this->_storage->save(); } } /** * 注冊依賴 */ Container::set("HardDiskStorage" , function(){ return new HardDiskStorage(); }); Container::set("UStorage" , function(){ return new UStorage(); }); // 測試 $cs = new ComputerStorage(); $cs->read();
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25788.html
摘要:構造器注入實現特定參數的構造函數,在新建對象時傳入所依賴類型的對象。 基本概念 1.依賴倒置(反轉)原則(DIP):一種軟件架構設計的原則(抽象概念,是一種思想)在面向對象編程領域中,依賴反轉原則(Dependency inversion principle,DIP)是指一種特定的解耦(傳統的依賴關系創建在高層次上,而具體的策略設置則應用在低層次的模塊上)形式,使得高層次的模塊不依賴于...
摘要:依賴注入控制反轉的一種具體實現方法。接下來,我們使用依賴注入實現控制反轉,使依賴關系倒置依賴被動傳入。從單元測試的角度看,依賴注入更方便和操作,方便了測試人員寫出質量更高的測試代碼。 前言 好的設計會提高程序的可復用性和可維護性,也間接的提高了開發人員的生產力。今天,我們就來說一下在很多框架中都使用的依賴注入。 一些概念 要搞清楚什么是依賴注入如何依賴注入,首先我們要明確一些概念。 D...
摘要:在中使用解耦,有兩種注入方式構造函數注入屬性注入。對象的實例化解析依賴信息該方法實質上就是通過的反射機制,通過類的構造函數的參數分析他所依賴的單元。 有關概念 依賴倒置原則(Dependence Inversion Principle, DIP) 傳統軟件設計中,上層代碼依賴于下層代碼,當下層出現變動時,上層也要相應變化。 DIP的核心思想是:上層定義接口,下層實現這個接口,從而使的下...
摘要:可以為服務提供者的方法設置類型提示。方法將在所有其他服務提供者均已注冊之后調用。所有服務提供者都在配置文件中注冊。可以選擇推遲服務提供者的注冊,直到真正需要注冊綁定時,這樣可以提供應用程序的性能。 本文最早發布于 Rootrl的Blog 導言 Laravel是一款先進的現代化框架,里面有一些概念非常重要。在上手Laravel之前,我認為先弄懂這些概念是很有必要的。你甚至需要重溫下PHP...
摘要:前言最近在使用框架,看了下他的源碼,發現有很多地方也用到了依賴注入控制反轉,覺得有必要和大家簡單聊一聊什么是依賴注入以及怎么使用它。概念依賴注入和控制反轉是對同一件事情的不同描述,從某個方面講,就是它們描述的角度不同。 前言 最近在使用ThinkPHP5框架,看了下他的源碼,發現有很多地方也用到了依賴注入(控制反轉),覺得有必要和大家簡單聊一聊什么是依賴注入以及怎么使用它。 簡介 I...
閱讀 999·2019-08-30 15:55
閱讀 3440·2019-08-30 13:10
閱讀 1268·2019-08-29 18:45
閱讀 2347·2019-08-29 16:25
閱讀 2107·2019-08-29 15:13
閱讀 2423·2019-08-29 11:29
閱讀 553·2019-08-26 17:34
閱讀 1486·2019-08-26 13:57