策略模式,又稱爲政策模式,屬於行爲型的設計模式。php
GoF定義:定義一系列的算法,把它們一個個封裝起來,而且使它們能夠相互替換。本模式使得算法可獨立於使用它的客戶而變化 。git
GoF類圖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())。一樣的,我不用關心他們的具體實現,我只要監督那個和咱們聯繫的渠道商就能夠啦,是否是很省心!測試
完整代碼:github.com/zhangyue050…優化
依然仍是短信功能,具體的需求能夠參看簡單工廠模式中的講解,可是這回咱們使用策略模式來實現!this
短信發送類圖
<?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的中間件就是這貨的典型的實現哦!!