zoukankan      html  css  js  c++  java
  • 设计模式之策略模式

    策略模式

    策略模式与简单工厂模式代码类似,但是核心类的思路迥异(后文介绍)

    策略模式主要是应对算法的频繁改动。

    例如:一个简易的计算器只有加减乘除等几个功能,算法固定,所以可以使用简单工厂模式。但是面对类似于商场活动这种需要频繁更改的需求,简单工厂模式就需要频繁更改工厂类以满足其需求(显然这不是我们期望的)。所以策略模式出现了。

    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 .'元';
        }
    }
    
    /**
     * 打折算法产品类
     */
    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);
        }
    }

    4、模拟客户端

    <?php
    
    namespace strategy;
    
    include '../autoload.php';
    // 满减折算
    $mode1 = new StrategyFind(new ManJianStrategy());
    $mode1->get(100);
    
    echo '<br>';
    
    // 满减活动
    $mode2= new StrategyFind(new DaZheStrategy());
    $mode2->get(100);

    心得:

    相对于简单工厂模式来说,祸水转移,将选择交给客户端完成。

    (1)简单工厂模式是将实例化的对象交给客户端进行操作,而策略模式将运算的结果返回给客户端

    (2)简单工厂模式是在核心类中进行选择实例化某个类,而策略模式的StrategyFind类则只管实例化运算类,选择权交给客户端完成

  • 相关阅读:
    模板、皮肤、主题的定义
    table的thead/tbody/tfoot/tr/th/td
    JavaScript实现图片拖动功能 SpryMap
    js调用.net后台事件,和后台调用前台等方法总结
    图片轮播效果
    关于json的一点总结
    jQuery插件编写
    JavaScript中的数组
    HTML中Form属性Name和ID的区别
    DetailsView和FormView
  • 原文地址:https://www.cnblogs.com/wawjandcsws/p/10936269.html
Copyright © 2011-2022 走看看