《设计模式 - 策略模式》
一:什么是策略模式?
- 定义上来说,策略模式(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