PHP面試常考之設計模式——策略模式

你好,是我琉憶,PHP程序員面試筆試系列圖書的做者。php

本週(2019.3.11至3.15)的一三五更新的文章以下:html

週一:PHP面試常考之設計模式——工廠模式
週三:PHP面試常考之設計模式——建造者模式
週五:PHP面試常考之設計模式——策略模式
本身上傳了一本電子書「 5種原則和23種設計模式」到百度雲,關注公衆號:「 琉憶編程庫」,回覆:「 23」,我發給你。

如下內容如需轉載,請註明做者和出處。程序員


策略模式

介紹

策略模式定義了一系列的算法,並將每個算法封裝起來,並且使它們還能夠相互替換。策略模式讓算法獨立於使用它的客戶而獨立變化。面試

UML圖

clipboard.png

說明

抽象策略角色: 策略類,一般由一個接口或者抽象類實現。算法

具體策略角色:包裝了相關的算法和行爲。編程

環境角色:持有一個策略類的引用,最終給客戶端調用。設計模式

應用場景

一、 多個類只區別在表現行爲不一樣,可使用Strategy模式,在運行時動態選擇具體要執行的行爲。測試

二、 須要在不一樣狀況下使用不一樣的策略(算法),或者策略還可能在將來用其它方式來實現。this

三、 對客戶隱藏具體策略(算法)的實現細節,彼此徹底獨立。spa

使用策略模式的好處

一、 策略模式提供了管理相關的算法族的辦法。策略類的等級結構定義了一個算法或行爲族。恰當使用繼承能夠把公共的代碼轉移到父類裏面,從而避免重複的代碼。

二、 策略模式提供了能夠替換繼承關係的辦法。繼承能夠處理多種算法或行爲。若是不是用策略模式,那麼使用算法或行爲的環境類就可能會有一些子類,每個子類提供一個不一樣的算法或行爲。可是,這樣一來算法或行爲的使用者就和算法或行爲自己混在一塊兒。決定使用哪種算法或採起哪種行爲的邏輯就和算法或行爲的邏輯混合在一塊兒,從而不可能再獨立演化。繼承使得動態改變算法或行爲變得不可能。

三、 使用策略模式能夠避免使用多重條件轉移語句。多重轉移語句不易維護,它把採起哪種算法或採起哪種行爲的邏輯與算法或行爲的邏輯混合在一塊兒,通通列在一個多重轉移語句裏面,比使用繼承的辦法還要原始和落後。

實現代碼

<?php
header("Content-type:text/html;Charset=utf-8");
//抽象策略接口
abstract class Strategy{
    abstract function wayToSchool();
}
//具體策略角色
class BikeStrategy extends Strategy{
    function wayToSchool(){
         echo "騎自行車去上學";
    }
}
class BusStrategy extends Strategy{
    function wayToSchool(){
         echo "乘公共汽車去上學";
    }
}
class TaxiStrategy extends Strategy{
    function wayToSchool(){
         echo "騎出租車去上學";
    }
}

//環境角色
class Context{
    private $strategy;
    //獲取具體策略
    function getStrategy($strategyName){
        try{
            $strategyReflection = new ReflectionClass($strategyName);
            $this->strategy = $strategyReflection->newInstance();

        }catch(ReflectionException $e){
             $this->strategy = ""; 
        }       
    }

    function goToSchool(){
        $this->strategy->wayToSchool();
        // var_dump($this->strategy);
    }
}

//測試
$context = new Context();
$context->getStrategy("BusStrategy");
$context->goToSchool();
 ?>
本身上傳了一本電子書「 5種原則和23種設計模式」到百度雲,關注公衆號:「 琉憶編程庫」,回覆:「 23」,我發給你。

本身編寫的《PHP程序員面試筆試寶典》《PHP程序員面試筆試真題解析》書籍,已在各大電商平臺銷售。書籍在手,Offer我有。
圖片描述
更多PHP相關的面試知識、考題能夠關注公衆號獲取:琉憶編程庫

clipboard.png

對本文有什麼問題或建議均可以進行留言,我將不斷完善追求極致,感謝大家的支持。

相關文章
相關標籤/搜索