你好,是我琉憶,PHP程序員面試筆試系列圖書的作者。
本週(2019.3.11至3.15)的一三五更新的文章如下:
週一:PHP面試常考之設計模式——工廠模式
週三:PHP面試常考之設計模式——建造者模式
週五:PHP面試常考之設計模式——策略模式
自己上傳了一本電子書“5種原則和23種設計模式”到百度雲,關注公衆號:“琉憶編程庫”,回覆:“23”,我發給你。
以下內容如需轉載,請註明作者和出處。
策略模式
介紹
策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立於使用它的客戶而獨立變化。
UML圖
說明
抽象策略角色: 策略類,通常由一個接口或者抽象類實現。
具體策略角色:包裝了相關的算法和行爲。
環境角色:持有一個策略類的引用,最終給客戶端調用。
應用場景
1、 多個類只區別在表現行爲不同,可以使用Strategy模式,在運行時動態選擇具體要執行的行爲。
2、 需要在不同情況下使用不同的策略(算法),或者策略還可能在未來用其它方式來實現。
3、 對客戶隱藏具體策略(算法)的實現細節,彼此完全獨立。
使用策略模式的好處
1、 策略模式提供了管理相關的算法族的辦法。策略類的等級結構定義了一個算法或行爲族。恰當使用繼承可以把公共的代碼轉移到父類裏面,從而避免重複的代碼。
2、 策略模式提供了可以替換繼承關係的辦法。繼承可以處理多種算法或行爲。如果不是用策略模式,那麼使用算法或行爲的環境類就可能會有一些子類,每一個子類提供一個不同的算法或行爲。但是,這樣一來算法或行爲的使用者就和算法或行爲本身混在一起。決定使用哪一種算法或採取哪一種行爲的邏輯就和算法或行爲的邏輯混合在一起,從而不可能再獨立演化。繼承使得動態改變算法或行爲變得不可能。
3、 使用策略模式可以避免使用多重條件轉移語句。多重轉移語句不易維護,它把採取哪一種算法或採取哪一種行爲的邏輯與算法或行爲的邏輯混合在一起,統統列在一個多重轉移語句裏面,比使用繼承的辦法還要原始和落後。
實現代碼
<?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相關的面試知識、考題可以關注公衆號獲取:琉憶編程庫
對本文有什麼問題或建議都可以進行留言,我將不斷完善追求極致,感謝你們的支持。