php 设计模式-策略模式
需求:想实现这样一个功能:开展一个网站邀请活动,然后参与者将推广的网站地址链接发给好友,好友点击链接后在网站注册成功,的邀请日志记录条数加1
这样我们实现了 主体(Activity)、策略(AbstractActivityStrategy -> DEFAULTActivityStrategy)、行为(ActivityLog、ActivityLogAmount)的分离。
1:如果产品人员现在决定不要计数这个功能,那我们只需修改 策略 模块。
2:如果决定邀请到一个人数字加2 ,我们则只需修改 相应的行为类。
3:在如果这个产品人员实在变态,把邀请的整个逻辑都改了,那我们只需要 增加相应的策略类,然后增加行为(如果存在就不必增加)。主体始终是不需要修改的。
<?php
/**
* 活动主体类
*/
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();
?>
- 上一篇:用PHP将文本转换Web页面
- 下一篇:仿discuz 上传头像






