真相就在那

博客园 首页 联系 订阅 管理

    这两天在开发用elgg作为基础的sns网站时,第一次遇到了策略模式的运用。

 

    想实现这样一个功能:开展一个网站邀请活动,然后参与者(owner)将推广的网站地址链接发给好友,好友点击链接后在网站注册成功,owner的邀请日志记录条数加1。

 

活动类 Activity

 

1 class Activity extends ElggEntity {
2 private $strategy; //用于保存策略实例
3  
4 public function __construction($guid) {
5 ...
6 $this->load($guid); //载入实体
7   }
8
9 public function addLog($data) {
10 $this->strategy->addLog($data); //实际是 DEFAULTActivityStrategy::addLog($data)
11 }
12
13 public function load ($guid) {
14 if (parent::load($guid)) { //此过程会将本实例的所有属性从数据库中赋值,因此 $this->strategyName的值已经被赋上了。
15 if ($this->strategyName != '') {
16 $this->strategy = AbstractActivityStrategy::getInstance($this->strategyName); //加载策略类
17 }
18 return true;
19 }
20 return false;
21 }
22 }
23

 

 

 

 日志类 ActivityLog

 

1 class ActivityLog extends ElggEntity {
2 $private countValue; //邀请记录数
3 ...
4 }

 

 

 

策略类 

 

说明:ElggEntity:所有实体基类。AbstractActivityStrategy:活动抽象类

1)首先创建一个活动:
$activity = new Activity();
$activity->name = 'KKND';    //活动名称
$activity->strategyName = 'DEFAULT';    //策略名称
$activity->save();    //将活动类保存至数据库,新添加的属性(比如strategyName)也会保存

2)别人收到邀请,点击链接后,owner的邀请记录条目+1
比如邀请网址是
http://www.xinwusi.com/KKND/1234
其中/KKND/是活动名称,1234是owner的guid,假设该活动的guid为 8888,则

$activity = new Activity(8888);   //获取活动实体
$activity->addLog($data);    //添加邀请记录。$data包括owner的guid,活动的guid,活动名name等。
      最后2行代码的过程,就是读取了该活动实体的策略名,并根据这个策略名生成一个策略实体,保存在自己的$stragety属性里,再调用其中的addLog方法增加日志记录。

      以后有新活动的时候,直接把活动实例属性的策略名改了,就可以调用对应新策略中的方法了。

 

1 class DEFAULTActivityStrategy extends AbstractActivityStrategy {
2 ...
3 public function addLog($data) {
4 $activityLog = new ActivityLog();
5 ...
6 $activityLog->save();
7 $activityLogAmount = new ActivityLogAmount(); //计数类
8 ...
9 $activityLogAmount->countValue += 1;
10 $activityLogAmount->save();
11 }
12 }

 

 

posted on 2010-03-18 23:44  fykknd  阅读(488)  评论(0)    收藏  举报