龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

php 设计模式-策略模式

时间:2014-07-22 14:51来源: 作者: 点击:
分享到:
pstrong需求:想实现这样一个功能:开展一个网站邀请活动,然后参与者将推广的网站地址链接发给好友,好友点击链接后在网站注册成功,的邀请日志记录条数加1/strongbr / br / 这样我们

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


?>
精彩图集

赞助商链接