策略模式
策略模式与简单工厂模式代码类似,但是核心类的思路迥异(后文介绍)
策略模式主要是应对算法的频繁改动。
例如:一个简易的计算器只有加减乘除等几个功能,算法固定,所以可以使用简单工厂模式。但是面对类似于商场活动这种需要频繁更改的需求,简单工厂模式就需要频繁更改工厂类以满足其需求(显然这不是我们期望的)。所以策略模式出现了。
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类则只管实例化运算类,选择权交给客户端完成
原文:https://www.cnblogs.com/wawjandcsws/p/10936269.html