国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

OOD、DIP、IOC、DI、依賴注入容器(即 控制反轉容器,IOC Container)

renweihub / 1920人閱讀

摘要:服務本省作為一個高層類,對外提供訪問,卻受制于提供具體服務的服務提供者定義的實現,高層模塊依賴底層模塊實現,違背了依賴倒置原則。遵循依賴倒置原則的例子場景同介紹中場景。

1. 名詞介紹

OOD,面向對象設計

DIP,依賴倒置(軟件設計原則)

IOC,控制反轉(軟件設計模式)

DI,依賴注入

IOC Container,控制反轉容器,也是依賴注入容器

2. 組成部分

服務清單(功能清單,service list)

服務(高層類,service ,對外提供服務)

服務提供者(底層類,service provider ,實際提供服務的對象)

2. 依賴倒置原則(DIP) 2.0 介紹

依賴倒置原則,它轉換了依賴,高層模塊不依賴于低層模塊的實現,而低層模塊依賴于高層模塊定義的接口

詳細介紹請點我

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)本省作為一個高層類,對外提供訪問,卻受制于提供具體服務的服務提供者(HardDiskStorageUStorage)定義的實現(saveToHardDisksaveToU、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)只需要切換服務提供者即可(HardDiskStorageUStorage),完全無需理會他們的實現(readFromHardDisk、readFromU...等)。高層模塊不依賴于底層模塊定義的實現,遵循了依賴倒置原則

3. 控制反轉(IOC) + 依賴注入(DI) 3.0 介紹

控制反轉(IoC),它為相互依賴的組件提供抽象,將依賴(低層模塊)對象的獲得交給第三方(系統)來控制,即依賴對象不在被依賴模塊的類中直接通過new來獲取

詳細介紹請點我

3.1 場景

2 場景

3.2 沒有實現控制反轉的例子

2 中的例子就是沒有實現控制反轉的例子。2ComputerStorage 獲取依賴(HardDiskStorageUStorage)的途徑都是在 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

相關文章

  • Yii2中的依賴注入

    摘要:構造器注入實現特定參數的構造函數,在新建對象時傳入所依賴類型的對象。 基本概念 1.依賴倒置(反轉)原則(DIP):一種軟件架構設計的原則(抽象概念,是一種思想)在面向對象編程領域中,依賴反轉原則(Dependency inversion principle,DIP)是指一種特定的解耦(傳統的依賴關系創建在高層次上,而具體的策略設置則應用在低層次的模塊上)形式,使得高層次的模塊不依賴于...

    harriszh 評論0 收藏0
  • 搞懂依賴注入, 用 PHP 手寫簡易 IOC 容器

    摘要:依賴注入控制反轉的一種具體實現方法。接下來,我們使用依賴注入實現控制反轉,使依賴關系倒置依賴被動傳入。從單元測試的角度看,依賴注入更方便和操作,方便了測試人員寫出質量更高的測試代碼。 前言 好的設計會提高程序的可復用性和可維護性,也間接的提高了開發人員的生產力。今天,我們就來說一下在很多框架中都使用的依賴注入。 一些概念 要搞清楚什么是依賴注入如何依賴注入,首先我們要明確一些概念。 D...

    antz 評論0 收藏0
  • Yii源碼解讀-依賴注入容器

    摘要:在中使用解耦,有兩種注入方式構造函數注入屬性注入。對象的實例化解析依賴信息該方法實質上就是通過的反射機制,通過類的構造函數的參數分析他所依賴的單元。 有關概念 依賴倒置原則(Dependence Inversion Principle, DIP) 傳統軟件設計中,上層代碼依賴于下層代碼,當下層出現變動時,上層也要相應變化。 DIP的核心思想是:上層定義接口,下層實現這個接口,從而使的下...

    Prasanta 評論0 收藏0
  • Laravel中的核心概念

    摘要:可以為服務提供者的方法設置類型提示。方法將在所有其他服務提供者均已注冊之后調用。所有服務提供者都在配置文件中注冊。可以選擇推遲服務提供者的注冊,直到真正需要注冊綁定時,這樣可以提供應用程序的性能。 本文最早發布于 Rootrl的Blog 導言 Laravel是一款先進的現代化框架,里面有一些概念非常重要。在上手Laravel之前,我認為先弄懂這些概念是很有必要的。你甚至需要重溫下PHP...

    ddongjian0000 評論0 收藏0
  • 聊一聊PHP的依賴注入(DI) 和 控制反轉(IoC)

    摘要:前言最近在使用框架,看了下他的源碼,發現有很多地方也用到了依賴注入控制反轉,覺得有必要和大家簡單聊一聊什么是依賴注入以及怎么使用它。概念依賴注入和控制反轉是對同一件事情的不同描述,從某個方面講,就是它們描述的角度不同。 前言 最近在使用ThinkPHP5框架,看了下他的源碼,發現有很多地方也用到了依賴注入(控制反轉),覺得有必要和大家簡單聊一聊什么是依賴注入以及怎么使用它。 簡介 I...

    sixgo 評論0 收藏0

發表評論

0條評論

renweihub

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<