設計模式之策略模式

電商類的項目,經常會有各種優惠活動,比如:滿XX減X ;全場X折等等。

比較直接的做法是在代碼里面各種if else 或者 switch case等。每次新增或者修改優惠策略,都可能會影響到其他的代碼,耦合比較嚴重。

現在我用策略模式來實現這樣的需求,看看帶來的變化。

下面是代碼:

<?php

//抽象策略類
abstract class PreferentialStrategy
{
    abstract public function calculate();
}


//具體策略
class FirstStrategy extends PreferentialStrategy
{
    public function calculate()
    {
        echo '滿100減10的算法';
    }
}

class SecondStrategy extends PreferentialStrategy
{
    public function calculate()
    {
        echo '全場9折的算法';
    }
}

//環境類
class Context
{
    private $_strategy;

    public function __construct(PreferentialStrategy $_strategy)
    {
        $this->_strategy = $_strategy;
    }

    public function handle()
    {
        $this->_strategy->calculate();
    }

}

$context = new Context(new FirstStrategy());
$context->handle();

策略模式是一種行為設計模式,總統的思想也比較簡潔,并不難以理解。

在上面的代碼中還存在一個問題:客戶端要明確的知道每個策略類的名稱才能使用,這個是不太合理的,因此在實際使用中,我們往往還會和簡單工廠結合,使客戶端調用起來更加方便。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 設計模式基本原則 開放-封閉原則(OCP),是說軟件實體(類、模塊、函數等等)應該可以拓展,但是不可修改。開-閉原...
    西山薄涼閱讀 3,856評論 3 14
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,886評論 18 139
  • qcow2鏡像不同于raw鏡像只需要一條簡單的命令就可任意減小鏡像大小,用的時間長了,會發現qcow2鏡像已經達到...
    劍膽琴心python閱讀 7,891評論 0 3
  • 在 UIView 中有一個autoresizingMask的屬性,它對應的是一個枚舉的值(如下),屬性的意思就是自...
    nenhall閱讀 212評論 0 0
  • 這段時間,我一直抱著頭在想,我為什么會失敗,我走到現在,做了很多虧本的生意,處了一些扯球蛋的人,也處了...
    青青蓮閱讀 148評論 0 0