初次接触php抽象工厂模式(Elgg)
想实现这样一个功能:开展一个网站邀请活动,然后参与者(owner)将推广的网站地址链接发给好友,好友点击链接后在网站注册成功,owner的邀请日志记录条数加1。
活动类 Activity
日志类 ActivityLog
策略类
说明:ElggEntity:所有实体基类。AbstractActivityStrategy:活动抽象类
)首先创建一个活动:
)别人收到邀请,点击链接后,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方法增加日志记录。
以后有新活动的时候,直接把活动实例属性的策略名改了,就可以调用对应新策略中的方法了。
活动类 Activity
代码如下:
class Activity extends ElggEntity { private $strategy; //用于保存策略实例 public function __construction($guid) { ... $this->load($guid); //载入实体 } public function addLog($data) { $this->strategy->addLog($data); //实际是 DEFAULTActivityStrategy::addLog($data) } public function load ($guid) { if (parent::load($guid)) { //此过程会将本实例的所有属性从数据库中赋值,因此 $this->strategyName的值已经被赋上了。 if ($this->strategyName != '') { $this->strategy = AbstractActivityStrategy::getInstance($this->strategyName); //加载策略类 } return true; } return false; } }
日志类 ActivityLog
代码如下:
class ActivityLog extends ElggEntity { $private countValue; //邀请记录数 ... }
策略类
说明:ElggEntity:所有实体基类。AbstractActivityStrategy:活动抽象类
)首先创建一个活动:
代码如下:
$activity = new Activity(); $activity->name = 'KKND'; //活动名称 $activity->strategyName = 'DEFAULT'; //策略名称 $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方法增加日志记录。
以后有新活动的时候,直接把活动实例属性的策略名改了,就可以调用对应新策略中的方法了。
代码如下:
class DEFAULTActivityStrategy extends AbstractActivityStrategy { ... public function addLog($data) { $activityLog = new ActivityLog(); ... $activityLog->save(); $activityLogAmount = new ActivityLogAmount(); //计数类 ... $activityLogAmount->countValue += 1; $activityLogAmount->save(); } }
相关推荐
Kingonion 2020-05-01
codercheng 2019-11-10
bleach00 2010-11-17
Yellowpython 2019-06-25
liupinghui 2019-06-21
特 2009-11-06
loganjr 2011-10-18
姜海强 2019-03-14
ainizhongguoaa 2016-08-25
luoxinyurose 2016-03-02
PythonBiglove 2016-01-16
LHpython 2019-01-15
PHP100 2019-03-28
PHP100 2019-03-28
vczh的日常 2018-04-12
MATLAB 2018-03-29