策略模式,又稱爲政策模式,屬於行爲型的設計模式。php
GoF定義:定義一系列的算法,把它們一個個封裝起來,而且使它們能夠相互替換。本模式使得算法可獨立於使用它的客戶而變化 。laravel
GoF類圖git
代碼實現github
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();
最後,在客戶端按需調用合適的算法。微信
既然和簡單工廠如此的相像,那麼咱們也按照簡單工廠的方式來講:咱們是一個手機廠商(Client),想找某工廠(ConcreteStrategy)來作一批手機,經過渠道商(Context)向這個工廠下單製造手機,渠道商直接去聯繫代工廠(Strategy),而且直接將生產完成的手機發貨給我(ContextInterface())。一樣的,我不用關心他們的具體實現,我只要監督那個和咱們聯繫的渠道商就能夠啦,是否是很省心!函數
完整代碼:https://github.com/zhangyue0503/designpatterns-php/blob/master/10.strategy/source/strategy.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();
說明
關注公衆號:【硬核項目經理】獲取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免費得PHP、項目管理學習資料
知乎、公衆號、抖音、頭條搜索【硬核項目經理】
B站ID:482780532