初次接触php抽象工厂模式(Elgg)
程序员文章站
2022-07-03 12:27:02
想实现这样一个功能:开展一个网站邀请活动,然后参与者(owner)将推广的网站地址链接发给好友,好友点击链接后在网站注册成功,owner的邀请日志记录条数加1。 活动类 a...
想实现这样一个功能:开展一个网站邀请活动,然后参与者(owner)将推广的网站地址链接发给好友,好友点击链接后在网站注册成功,owner的邀请日志记录条数加1。
活动类 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();
}
}
活动类 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();
}
}
上一篇: 给采用CMS系统做站的站长们几点优化建议
下一篇: 清朝皇帝驾崩后,丧礼流程是怎样的?