《设计模式 - 策略模式》

一:什么是策略模式?

  - 定义上来说,策略模式(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 "\n";

 github:

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

 

posted @ 2018-10-26 11:23  Zzz哈  Views(129)  Comments(0Edit  收藏  举报