初次接觸php抽象工廠模式(Elgg)
更新時(shí)間:2010年03月21日 15:42:14 作者:
這兩天在開(kāi)發(fā)用elgg作為基礎(chǔ)的sns網(wǎng)站時(shí),第一次遇到了策略模式的運(yùn)用。
想實(shí)現(xiàn)這樣一個(gè)功能:開(kāi)展一個(gè)網(wǎng)站邀請(qǐng)活動(dòng),然后參與者(owner)將推廣的網(wǎng)站地址鏈接發(fā)給好友,好友點(diǎn)擊鏈接后在網(wǎng)站注冊(cè)成功,owner的邀請(qǐng)日志記錄條數(shù)加1。
活動(dòng)類 Activity
class Activity extends ElggEntity {
private $strategy; //用于保存策略實(shí)例
public function __construction($guid) {
...
$this->load($guid); //載入實(shí)體
}
public function addLog($data) {
$this->strategy->addLog($data); //實(shí)際是 DEFAULTActivityStrategy::addLog($data)
}
public function load ($guid) {
if (parent::load($guid)) { //此過(guò)程會(huì)將本實(shí)例的所有屬性從數(shù)據(jù)庫(kù)中賦值,因此 $this->strategyName的值已經(jīng)被賦上了。
if ($this->strategyName != '') {
$this->strategy = AbstractActivityStrategy::getInstance($this->strategyName); //加載策略類
}
return true;
}
return false;
}
}
日志類 ActivityLog
class ActivityLog extends ElggEntity {
$private countValue; //邀請(qǐng)記錄數(shù)
...
}
策略類
說(shuō)明:ElggEntity:所有實(shí)體基類。AbstractActivityStrategy:活動(dòng)抽象類
)首先創(chuàng)建一個(gè)活動(dòng):
$activity = new Activity();
$activity->name = 'KKND'; //活動(dòng)名稱
$activity->strategyName = 'DEFAULT'; //策略名稱
$activity->save(); //將活動(dòng)類保存至數(shù)據(jù)庫(kù),新添加的屬性(比如strategyName)也會(huì)保存
)別人收到邀請(qǐng),點(diǎn)擊鏈接后,owner的邀請(qǐng)記錄條目+1
比如邀請(qǐng)網(wǎng)址是 http://www.xinwusi.com/KKND/1234
其中/KKND/是活動(dòng)名稱,1234是owner的guid,假設(shè)該活動(dòng)的guid為 8888,則
$activity = new Activity(8888); //獲取活動(dòng)實(shí)體
$activity->addLog($data); //添加邀請(qǐng)記錄。$data包括owner的guid,活動(dòng)的guid,活動(dòng)名name等。
最后2行代碼的過(guò)程,就是讀取了該活動(dòng)實(shí)體的策略名,并根據(jù)這個(gè)策略名生成一個(gè)策略實(shí)體,保存在自己的$stragety屬性里,再調(diào)用其中的addLog方法增加日志記錄。
以后有新活動(dòng)的時(shí)候,直接把活動(dòng)實(shí)例屬性的策略名改了,就可以調(diào)用對(duì)應(yīng)新策略中的方法了。
class DEFAULTActivityStrategy extends AbstractActivityStrategy {
...
public function addLog($data) {
$activityLog = new ActivityLog();
...
$activityLog->save();
$activityLogAmount = new ActivityLogAmount(); //計(jì)數(shù)類
...
$activityLogAmount->countValue += 1;
$activityLogAmount->save();
}
}
活動(dòng)類 Activity
復(fù)制代碼 代碼如下:
class Activity extends ElggEntity {
private $strategy; //用于保存策略實(shí)例
public function __construction($guid) {
...
$this->load($guid); //載入實(shí)體
}
public function addLog($data) {
$this->strategy->addLog($data); //實(shí)際是 DEFAULTActivityStrategy::addLog($data)
}
public function load ($guid) {
if (parent::load($guid)) { //此過(guò)程會(huì)將本實(shí)例的所有屬性從數(shù)據(jù)庫(kù)中賦值,因此 $this->strategyName的值已經(jīng)被賦上了。
if ($this->strategyName != '') {
$this->strategy = AbstractActivityStrategy::getInstance($this->strategyName); //加載策略類
}
return true;
}
return false;
}
}
日志類 ActivityLog
復(fù)制代碼 代碼如下:
class ActivityLog extends ElggEntity {
$private countValue; //邀請(qǐng)記錄數(shù)
...
}
策略類
說(shuō)明:ElggEntity:所有實(shí)體基類。AbstractActivityStrategy:活動(dòng)抽象類
)首先創(chuàng)建一個(gè)活動(dòng):
復(fù)制代碼 代碼如下:
$activity = new Activity();
$activity->name = 'KKND'; //活動(dòng)名稱
$activity->strategyName = 'DEFAULT'; //策略名稱
$activity->save(); //將活動(dòng)類保存至數(shù)據(jù)庫(kù),新添加的屬性(比如strategyName)也會(huì)保存
)別人收到邀請(qǐng),點(diǎn)擊鏈接后,owner的邀請(qǐng)記錄條目+1
比如邀請(qǐng)網(wǎng)址是 http://www.xinwusi.com/KKND/1234
其中/KKND/是活動(dòng)名稱,1234是owner的guid,假設(shè)該活動(dòng)的guid為 8888,則
$activity = new Activity(8888); //獲取活動(dòng)實(shí)體
$activity->addLog($data); //添加邀請(qǐng)記錄。$data包括owner的guid,活動(dòng)的guid,活動(dòng)名name等。
最后2行代碼的過(guò)程,就是讀取了該活動(dòng)實(shí)體的策略名,并根據(jù)這個(gè)策略名生成一個(gè)策略實(shí)體,保存在自己的$stragety屬性里,再調(diào)用其中的addLog方法增加日志記錄。
以后有新活動(dòng)的時(shí)候,直接把活動(dòng)實(shí)例屬性的策略名改了,就可以調(diào)用對(duì)應(yīng)新策略中的方法了。
復(fù)制代碼 代碼如下:
class DEFAULTActivityStrategy extends AbstractActivityStrategy {
...
public function addLog($data) {
$activityLog = new ActivityLog();
...
$activityLog->save();
$activityLogAmount = new ActivityLogAmount(); //計(jì)數(shù)類
...
$activityLogAmount->countValue += 1;
$activityLogAmount->save();
}
}
相關(guān)文章
php觀察者模式應(yīng)用場(chǎng)景實(shí)例詳解
這篇文章主要介紹了php觀察者模式應(yīng)用場(chǎng)景,結(jié)合完整實(shí)例形式詳細(xì)分析了php觀察者模式的具體定義與使用技巧,需要的朋友可以參考下2017-02-02php計(jì)算數(shù)組不為空元素個(gè)數(shù)的方法
本文為大家介紹下php計(jì)算數(shù)組不為空元素個(gè)數(shù)的方法,需要的朋友可以參考下2014-01-01探討PHP使用eAccelerator的API開(kāi)發(fā)詳解
本篇文章是對(duì)PHP使用eAccelerator的API開(kāi)發(fā)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06php mssql 數(shù)據(jù)庫(kù)分頁(yè)SQL語(yǔ)句
php mssql幾條常見(jiàn)的數(shù)據(jù)庫(kù)分頁(yè) SQL 語(yǔ)句2008-12-12php使用標(biāo)簽替換的方式生成靜態(tài)頁(yè)面
php可以通過(guò)自帶函數(shù)preg_replace可以用數(shù)組批量替換,不過(guò)用正則表達(dá)式替換效率很低,用起來(lái)也不方便。具體參考php手冊(cè)。有需要的小伙伴可以參考下。2015-05-05PHP中使用unset銷毀變量并內(nèi)存釋放問(wèn)題
PHP的unset()函數(shù)用來(lái)清除、銷毀變量,不用的變量,我們可以用unset()將它銷毀。但是某些時(shí)候,用unset()卻無(wú)法達(dá)到銷毀變量占用的內(nèi)存!2012-07-07WordPress開(kāi)發(fā)中自定義菜單的相關(guān)PHP函數(shù)使用簡(jiǎn)介
這篇文章主要介紹了WordPress開(kāi)發(fā)中自定義菜單的相關(guān)PHP函數(shù)使用,包括過(guò)濾掉自定義菜單中無(wú)用的class值的方法,需要的朋友可以參考下2016-01-01