一起聊聊PHP中的策略模式

青灯夜游
發布: 2023-04-10 10:50:02
轉載
3087 人瀏覽過

在先前的文章《深入淺析PHP中的指令模式》中我們介紹了PHP中的指令模式,以下這篇文章帶大家了解一下PHP中的策略模式。

一起聊聊PHP中的策略模式

策略模式,又稱為政策模式,屬於行為型的設計模式。

Gof類別圖及解釋

GoF定義:定義一連串的演算法,把它們一個個封裝起來,並且使它們可以互相替換。本模式使得演算法可獨立於使用它的客戶而變化 。

GoF類別圖

一起聊聊PHP中的策略模式

#程式碼實作

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

#實例

依然還是簡訊功能,具體的需求可以參考簡單工廠模式中的講解,但是這回我們使用策略模式來實現!

簡訊發送類別圖

一起聊聊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 &#39;百度云发送信息!&#39;;
    }
}

class AliYunMessage implements Message
{
    public function send()
    {
        echo &#39;阿里云发送信息!&#39;;
    }
}

class JiguangMessage implements Message
{
    public function send()
    {
        echo &#39;极光发送信息!&#39;;
    }
}

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();
登入後複製

說明

  • 注意對比下類別圖,基本和簡單工廠模式沒什麼區別
  • 策略模式定義的是演算法,從概念上看,這些演算法完成的都是相同的工作,只是實作不同,但東西是死的,人是活的,具體想怎麼用,還不是看大家的興趣咯
  • 策略模式可以優化單元測試,因為每個演算法都有自己的類,所以可以透過自己的介面單獨測試

原文網址:https://juejin.cn/post/6844903955860996110

作者:硬核心專案經理

#推薦學習:《PHP影片教學

以上是一起聊聊PHP中的策略模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:juejin.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板