策略模式的简单解释就是一个主体为了解决某个问题列出几种策略,根据策略产生具体的行为方法。
想实现这样一个功能:开展一个网站邀请活动,然后参与者将推广的网站地址链接发给好友,好友点击链接后在网站注册成功,的邀请日志记录条数加1
采用策略模式我们可以
1:如果产品人员现在决定不要计数这个功能,那我们只需修改 策略模块。
2:如果决定邀请到一个人数字加2 ,我们则只需修改相应的行为类。
3:在如果这个产品人员实在变态,把邀请的整个逻辑都改了,那我们只需要 增加相应的策略类,然后增加行为(如果存在就不必增加)主体始终是不需要修改的。
/** * 活动主体类 */ class Activity { private $strategy; //用于保存策略实例 public $strategyName = 'DEFAULTActivityStrategy'; public function __construct($strategyName) { if(!empty($strategyName)){ $this->strategyName = $strategyName; } $this->strategy = AbstractActivityStrategy::getInstance($this->strategyName); //加载策略类 } public function addLog() { $data = array('id'=>'uid','event'=>'eventName'); // 添加到数据库的数据 $this->strategy->addLog($data); } } /** * 策略工厂策略类 */ abstract class AbstractActivityStrategy { abstract public function addLog($data); public static function getInstance($strategyName) { return new $strategyName; } } /** * 策略具体类 */ class DEFAULTActivityStrategy extends AbstractActivityStrategy { public function addLog($data) { $activityLog = new ActivityLog(); $activityLog->save($data); $activityLogAmount = new ActivityLogAmount(); //计数类 $activityLogAmount->countValue += 1; $activityLogAmount->save(); } } /** * 活动日志具体类 */ class ActivityLog { public function save($data) { echo "数据保存到数据库<br/>"; } } /** * 活动计数具体类 */ class ActivityLogAmount { public $countValue; //邀请记录数 public function __construct() { $this->countValue = 0; } public function save() { echo "推荐次数为".$this->countValue; } } $activity = new Activity(null); $activity->addLog();
测试结果为
数据保存到数据库
推荐次数为1