• 《设计模式


    一:什么是策略模式?

      - 定义上来说,策略模式(Strategy)它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。

      - 简单来说,策略模式就是根据用户不同行为执行不同策略,产生不同的效果,他们都是完成相同的工作,只是实现方式不同,但是采取相同的调用减少了不同策略算法上产生的耦合

    二:为什么要使用策略模式(应用场景)?

      - 拿商场来说举例子,在商场中可能有多种促销模式

        - 比如:

          - 今天过节八折优惠

          - 今天有个满500反100的活动

           - ...

      - 在活动内容(算法)都不可控的情况下,不可能反复的去修改我们原来的金额逻辑,会造成代码的不可维护和意外BUG的出现。

      - 在策略模式中,我们可以为这种多变的规则设定不同的策略,用来处理这种变化的可能性

      - 不只是在算法上,在实践中,我们可以用它来封装几乎任何类型的规则

    三:策略模式的原理?

      - 策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。

      - 策略模式结构图

      - 

    四:策略模式的实现? 

    <?php
    /*
     * 策略模式(Strategy):它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。
     * 适用于经常变化的业务,比如,商场打折/电影票价格等模式的拆分
     */
    
    // 收费抽象类
    abstract class CashSuper
    {
        abstract public function acceptCache($money);
    }
    
    // 正常收费子类
    class CacheNormal extends CashSuper
    {    
        public function acceptCache($money)
        {
            // 正常收费 - 原价返回
            return $money;
        }
    }
    
    // 折扣子类
    class CacheRebate extends CashSuper
    {
        // 折扣率 - 暂定手动修改
        private $moneyRebate = 0.8;
        
        public function acceptCache($money)
        {
            return $money * $this->moneyRebate;
        }
    }
    
    // 满减子类
    class CacheRetuen extends CashSuper
    {
        private $moneyMax    = 500;
        private $moneyReturn = 100;
        
        public function acceptCache($money)
        {
            if ($money >= $this->moneyMax) {
                $money -= $this->moneyReturn;
            }
            return $money;
        }
    }
    
    switch ($argv[1]) {
        case '正常价格':
            $strategy = new CacheNormal();
            break;
        case '满500-100':
            $strategy = new CacheRetuen();
            break;
        case '打八折':
            $strategy = new CacheRebate();
    }
    
    echo $strategy->acceptCache(20);
    echo "
    ";

     github:

      - https://github.com/papapalh/Php-Practice/blob/master/Design%20pattern/Strategy.php

  • 相关阅读:
    opencv for java via cmake-gui
    ubuntu的设置里少了好多设置
    vue组件化编程应用2
    vue组件化编程应用
    vue组件化编程
    es6基本介绍及使用
    webpack基本介绍及使用
    npm基本介绍及使用
    node基本介绍及使用
    前后端分离基本介绍
  • 原文地址:https://www.cnblogs.com/25-lH/p/9855296.html
Copyright © 2020-2023  润新知