初次接触php抽象工厂模式(Elgg)

来源:互联网 发布:织梦小说网站源码 编辑:程序博客网 时间:2024/05/18 00:00

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

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

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

日志类 ActivityLog

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

策略类 
说明:ElggEntity:所有实体基类。AbstractActivityStrategy:活动抽象类 
)首先创建一个活动:

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

)别人收到邀请,点击链接后,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方法增加日志记录。 
以后有新活动的时候,直接把活动实例属性的策略名改了,就可以调用对应新策略中的方法了。 

Code:
  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. }   

 

原创粉丝点击