站長資訊網
        最全最豐富的資訊網站

        一起聊聊PHP中的策略模式

        在之前的文章《深入淺析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 '百度云發送信息!';     } }  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();

        說明

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

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

        作者:硬核項目經理

        推薦學習:《PHP視頻教程》

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 日韩精品无码久久久久久 | 97精品在线播放| 日本五区在线不卡精品| 国产成人精品综合网站| 亚洲国产精品无码久久九九| www夜片内射视频日韩精品成人| 国产日韩精品中文字无码| 亚洲电影日韩精品 | 国产高清国内精品福利99久久| 精品久久久久中文字幕日本| 亚州日韩精品专区久久久| 国产精品欧美久久久久无广告 | 国产精品久久久天天影视香蕉| 动漫精品专区一区二区三区不卡| 亚洲国产精品无码久久| 久久国产精品二国产精品| 97久人人做人人妻人人玩精品 | 2021久久精品国产99国产精品| 中文成人无码精品久久久不卡| 久久国产精品免费一区| 国产精品免费大片一区二区| 你懂的国产精品| 国产欧美国产精品第一区| 国产精品丝袜一区二区三区| 熟女精品视频一区二区三区| 伊人久久精品影院| 亚洲午夜成人精品电影在线观看| 精品无码人妻一区二区三区不卡| 国产成人精品一区二三区在线观看| 欧美精品免费线视频观看视频| 精品精品国产高清a毛片牛牛| 91精品国产9l久久久久| 97久久精品无码一区二区天美| 精品人妻中文字幕有码在线| 久久精品国产亚洲AV无码麻豆| 久久国产精品一国产精品金尊| 亚洲av午夜成人片精品网站 | 亚洲国产精品自产在线播放| 亚洲精品一级无码中文字幕| 亚洲精品在线视频| 无码囯产精品一区二区免费|