「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

 

总结

     

  策略模式就是使用封装一个公共抽象算法,每个算法(比如,打折算法,满减算法)实现这个接口,然后搞个策略工厂类来调用这些算法。

 

posted @ 2018-08-28 16:00  侯大宝  阅读(6142)  评论(0编辑  收藏  举报