設(shè)計模式之:策略模式(講解依賴倒置,控制反轉(zhuǎn),依賴注入)

策略模式(講解依賴倒置,控制反轉(zhuǎn),依賴注入)

在策略模式中,我們創(chuàng)建表示各種策略的對象和一個行為隨著策略對象改變而改變的 context 對象。策略對象改變 context 對象的執(zhí)行算法。


我們簡單來理解策略模式,假設(shè)我們設(shè)計一個機(jī)器人,我們對于不同的國家設(shè)計出不同的語言模塊,這個語言模塊就是一個策略。當(dāng)我們要出廠一個機(jī)器人的時候,一開始我們的設(shè)計:


//機(jī)器人說話模塊抽象
interface IRobot
{
    function speak();
}

//中文說話模塊
class ChinaRobet implements IRobot
{   
    //override
    static function speak(){
        echo '你好';
    }
}

//日文說話模塊
class JapanRobet implements IRobot
{   
    //override
    static function speak(){
        echo 'こんにちは';
    }
}

//機(jī)器人
class Robot
{   
    //說話方法
    function speak(){
        if($_GET['China']){
            ChinaRobet::speak();
        }else if($_GET['Japan']){
            JapanRobot::speak;
        }
    }
}

$robot = new Robot();
$robot->speak();

這樣,這個出廠的機(jī)器人就擁有了說話的能力。但是呢,由于在每個設(shè)定的時候,都要帶上兩個國家說話模塊,(依賴兩個類),這樣就增加了耦合,并且機(jī)器人高層次的依賴于低層次的說話模塊?,F(xiàn)在我們改一下這個模塊:


//機(jī)器人
class Robot
{   
    protect $speakModel;
    //說話方法
    function speak(){
        $this->speakModel->speak();
    }
    
    function setModel(IRobot $speakModel)
    {
        $this->speakModel = $speakModel;
    }
}


if($_GET['China']){
    $speakModel = new ChinaRobot();     
}else if($_GET['Japan']){
    $speakModel = new JapanRobot(); 
}


$robot = new Robot();
$robot->setModel($speakModel);
$robot->speak();

這樣的話,在機(jī)器人設(shè)定的時候,我們不依賴于他底層的模塊,只是設(shè)定他抽象出來說話的功能。
這樣,你裝載了什么模塊,機(jī)器人就在說話功能時做出不一樣的處理。這樣機(jī)器人就不依賴于底層的模塊,只去按照抽象接口去實現(xiàn)自己的方法。這就是依賴倒置。
當(dāng)Robot內(nèi)部不再需要實例化兩個語言模塊,自己只關(guān)心依賴提供的方法,這就是控制反轉(zhuǎn)。以前是Robot類要實例化并且操作兩個語言包,現(xiàn)在只需要實現(xiàn)自己的功能就好了。

依賴注入就更簡單啦,你裝上模塊,將robot依賴的模塊通過參數(shù)傳遞進(jìn)來的方式就是注入。依賴注入

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容