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类则只管实例化运算类,选择权交给客户端完成

  • 相关阅读:
    Team Foundation Sidekicks 2010
    Asp.net页面传值的方式汇总
    轻量级IOC框架Ninject使用
    AutoMapper使用简单总结
    页面请求的方式(Get与Post)
    总结2012 规划2013
    在reset css后两个input之间还是出现默认间隔的问题。
    js学习笔记事件委托
    程序猿工具——svn
    JS 事件添加onclick写法注意。
  • 原文地址:https://www.cnblogs.com/wawjandcsws/p/10936269.html
Copyright © 2011-2022 走看看