策略模式,又稱為政策模式,屬于行為型的設計模式,
Gof類圖及解釋
GoF定義:定義一系列的演算法,把它們一個個封裝起來,并且使它們可以相互替換,本模式使得演算法可獨立于使用它的客戶而變化 ,
GoF類圖

代碼實作
interface Strategy{
function AlgorithmInterface();
}
class ConcreteStrategyA implements Strategy{
function AlgorithmInterface(){
echo "演算法A";
}
}
class ConcreteStrategyB implements Strategy{
function AlgorithmInterface(){
echo "演算法B";
}
}
class ConcreteStrategyC implements Strategy{
function AlgorithmInterface(){
echo "演算法C";
}
}
定義演算法抽象及實作,
class Context{
private $strategy;
function __construct(Strategy $s){
$this->strategy = $s;
}
function ContextInterface(){
$this->strategy->AlgorithmInterface();
}
}
定義執行環境背景關系,
$strategyA = new ConcreteStrategyA();
$context = new Context($strategyA);
$context->ContextInterface();
$strategyB = new ConcreteStrategyB();
$context = new Context($strategyB);
$context->ContextInterface();
$strategyC = new ConcreteStrategyC();
$context = new Context($strategyC);
$context->ContextInterface();
最后,在客戶端按需呼叫合適的演算法,
- 是不是非常簡單的一個設計模式,大家有沒有發現這個模式和我們最早講過的簡單工廠非常類似
- 那么他們的區別呢?
- 工廠相關的模式屬于創建型模式,顧名思義,這種模式是用來創建物件的,回傳的是new出來的物件,要呼叫物件的什么方法是由客戶端來決定的
- 而策略模式屬性行為型模式,通過執行背景關系,將要呼叫的函式方法封裝了起來,客戶端只需要呼叫執行背景關系的方法就可以了
- 在這里,我們會發現,需要客戶端來實體化具體的演算法類,貌似還不如簡單工廠好用,既然這樣的話,大家何不嘗試一下結合工廠和策略模式一起來實作一個模式呢?
- 作為思考題將這個實作留給大家,提示:將Context類的__construct變成一個簡單工廠方法
既然和簡單工廠如此的相像,那么我們也按照簡單工廠的方式來說:我們是一個手機廠商(Client),想找某工廠(ConcreteStrategy)來做一批手機,通過渠道商(Context)向這個工廠下單制造手機,渠道商直接去聯系代工廠(Strategy),并且直接將生產完成的手機發貨給我(ContextInterface()),同樣的,我不用關心他們的具體實作,我只要監督那個和我們聯系的渠道商就可以啦,是不是很省心!
完整代碼:https://github.com/zhangyue0503/designpatterns-php/blob/master/10.strategy/source/strategy.php
實體
依然還是短信功能,具體的需求可以參看簡單工廠模式中的講解,但是這回我們使用策略模式來實作!
短信發送類圖

完整原始碼:https://github.com/zhangyue0503/designpatterns-php/blob/master/10.strategy/source/strategy-message.php
<?php
interface Message
{
public function send();
}
class BaiduYunMessage implements Message
{
function send()
{
echo '百度云發送資訊!';
}
}
class AliYunMessage implements Message
{
public function send()
{
echo '阿里云發送資訊!';
}
}
class JiguangMessage implements Message
{
public function send()
{
echo '極光發送資訊!';
}
}
class MessageContext
{
private $message;
public function __construct(Message $msg)
{
$this->message = $msg;
}
public function SendMessage()
{
$this->message->send();
}
}
$bdMsg = new BaiduYunMessage();
$msgCtx = new MessageContext($bdMsg);
$msgCtx->SendMessage();
$alMsg = new AliYunMessage();
$msgCtx = new MessageContext($alMsg);
$msgCtx->SendMessage();
$jgMsg = new JiguangMessage();
$msgCtx = new MessageContext($jgMsg);
$msgCtx->SendMessage();
說明
- 注意對比下類圖,基本和簡單工廠模式沒什么區別
- 策略模式定義的是演算法,從概念上看,這些演算法完成的都是相同的作業,只是實作不同,但東西是死的,人是活的,具體想怎么用,還不是看大家的興趣咯
- 策略模式可以優化單元測驗,因為每個演算法都有自己的類,所以可以通過自己的介面單獨測驗
下期看點
策略模式算是一個中場休息,后面還有一大半的模式還沒有講呢,接下來登場的這位可是近幾年的網紅選手:責任鏈模式,不要告訴我你沒聽過這位的大名,Laravel的中間件就是這貨的典型的實作哦!!
關注公眾號:【硬核專案經理】獲取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免費得PHP、專案管理學習資料
知乎、公眾號、抖音、頭條搜索【硬核專案經理】
B站ID:482780532
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/238334.html
標籤:PHP
上一篇:JDK 8 新特性,從入門到精通
下一篇:PHP+Redis的使用
