海角不转弯

代码是梦想的砖

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

策略模式的简单解释就是一个主体为了解决某个问题列出几种策略,根据策略产生具体的行为方法。

想实现这样一个功能:开展一个网站邀请活动,然后参与者将推广的网站地址链接发给好友,好友点击链接后在网站注册成功,的邀请日志记录条数加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

posted on 2013-03-19 22:40  海角不转弯  阅读(143)  评论(0编辑  收藏  举报