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

        一起聊聊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號
        主站蜘蛛池模板: 91精品国产综合久久精品| 99热都是精品久久久久久| 日韩精品久久无码人妻中文字幕 | 午夜在线视频91精品| 国产一精品一av一免费爽爽 | 国产欧美一区二区精品性色99| 911亚洲精品国内自产| 久久91综合国产91久久精品| 欧美人与动牲交a欧美精品| 国产午夜精品一区二区三区小说 | 国产l精品国产亚洲区在线观看| 国产精品高清2021在线 | 国产三级精品三级在线观看| 国产精品日韩欧美在线第3页| 无码国内精品久久人妻| 亚洲综合精品网站在线观看| 久久国产乱子伦精品免费午夜| 精品亚洲成α人无码成α在线观看 | 久久se精品一区二区| 乱色精品无码一区二区国产盗| 久久精品人人做人人妻人人玩| 国产亚洲欧洲精品| 日韩精品一区二区三区大桥未久| 久久精品国产一区二区| 高清免费久久午夜精品| 无码精品久久一区二区三区| 亚洲精品无码av人在线观看 | 精品久久久久久亚洲| 成人精品一区二区三区免费看| 国产精品欧美日韩| 精品国精品国产自在久国产应用男| 日韩欧美亚洲国产精品字幕久久久 | 精品日韩亚洲AV无码| 国产精品成人无码久久久久久| MM1313亚洲国产精品| 中文精品久久久久人妻不卡 | 热久久国产精品| 宅男在线国产精品无码| 国产精品免费在线播放| 国产精品狼人久久久久影院 | 亚洲精品线在线观看|