「PHP」策略模式


引言
 
  所屬:行為型模式,常用設計模式之一
     學習資料:
  • 《大話設計模式》程傑
 
模式概述
 
  分享一篇關於策略模式講的很好的文章,大家可以參考一下: https://www.cnblogs.com/qixuejia/p/4370270.html
 
  策略模式就是用來封裝算法的,但在實踐中,我們發現可以用它來封裝幾乎任何類型的規則,只要在分析過程中聽到需要在不同時間應用不同的業務規則,就可以考慮使用策略模式處理這種變化的可能性。
 
舉個栗子
 
    超市促銷活動,分別有原價,八折,滿300減50,使用策略模式……,程序如何設計。
       
 
     流程圖如下:
      
          

 

  
程序設計代碼:
 1. 抽象活動算法類
<?php
/**
 * 抽象活動算法類
 */
namespace strategy;

abstract class StrategyAbstract
{
    /**
     * 具體活動算法方法
     * @return mixed
     */
    public abstract function doAction($money);
}

 

2. 具體算法產品類

<?php
/**
 * 滿減算法產品類
 */
namespace strategy;

class ManJianStrategy extends StrategyAbstract
{
    public function doAction($money)
    {
        echo '滿減算法:原價'. $money .'元';
    }
}
<?php
/**
 * 打折算法產品類
 */
namespace strategy;

class DaZheStrategy extends StrategyAbstract
{
    /**
     * 具體算法實現
     * @param $money
     * @return mixed|void
     */
    public function doAction($money)
    {
        echo '打折算法:原價'. $money .'元';
    }
}

 

3. 策略工廠類

<?php
/**
 * 策略工廠類
 */
namespace strategy;

class StrategyFind
{
    private $strategy_mode;

    /**
     * 初始時,傳入具體的策略對象
     * @param $mode
     */
    public function __construct($mode)
    {
        $this->strategy_mode = $mode;
    }

    /**
     * 執行打折算法
     * @param $money
     */
    public function get($money)
    {
        $this->strategy_mode->doAction($money);
    }
}

 

入口文件

<?php

namespace strategy;

include '../autoload.php';
// 滿減折算
$mode1 = new StrategyFind(new ManJianStrategy());
$mode1->get(100);

echo '<br>';

// 滿減活動
$mode2= new StrategyFind(new DaZheStrategy());
$mode2->get(100);

 

 
以下為源碼地址

  

  GitHub源碼地址:https://github.com/xiaobaoword/design_pattern/tree/master

 

總結

     

  策略模式就是使用封裝一個公共抽象算法,每個算法(比如,打折算法,滿減算法)實現這個接口,然后搞個策略工廠類來調用這些算法。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM