所属:行为型模式,常用设计模式之一
学习资料:
- 《大话设计模式》程杰
分享一篇关于策略模式讲的很好的文章,大家可以参考一下:https://www.cnblogs.com/qixuejia/p/4370270.html
策略模式就是用来封装算法的,但在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。
超市促销活动,分别有原价,八折,满300减50,使用策略模式……,程序如何设计。
流程图如下:
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 .'元'; } }
<?php /** * 打折算法产品类 */ 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); } }
入口文件
<?php namespace strategy; include '../autoload.php'; // 满减折算 $mode1 = new StrategyFind(new ManJianStrategy()); $mode1->get(100); echo '<br>'; // 满减活动 $mode2= new StrategyFind(new DaZheStrategy()); $mode2->get(100);
GitHub源码地址:https://github.com/xiaobaoword/design_pattern/tree/master
策略模式就是使用封装一个公共抽象算法,每个算法(比如,打折算法,满减算法)实现这个接口,然后搞个策略工厂类来调用这些算法。