<?php/*** 策略模式需求:想實現這樣一個功能:開展一個網站邀請活動,然後參與者將推廣的網站地址連結發給好友,好友點選連結後在網站註冊成功,的邀請日誌記錄條數加1這樣我們實現了主體Activity)、策略AbstractActivityStrategy -> DEFAULTActivityStrategy)、行為ActivityLog、ActivityLogAmount)的分離。1:如果產品人員現在決定不要計數這個功能,那我們只需修改 策略 模組。2:如果決定邀請到一個人數字加2 ,我們則只需修改 相應的行為類。3:在如果這個產品人員實在變態,把邀請的整個邏輯都改了,那我們只需要增加相應的策略類,然後增加行為如果存在就不必增加),主體始終是不需要修改的。*//*** 活動主體類*/class Activity {private $strategy; //用於儲存策略執行個體public $strategyName = 'DEFAULTActivityStrategy';public function __construct($strategyName) {if(!empty($strategyName)){$this->strategyName = $strategyName;}$this->strategy = AbstractActivityStrategy::getInstance($this->strategyName); //載入策略類}public function addLog() {$data = array('id'=>'uid','event'=>'eventName'); // 添加到資料庫的資料$this->strategy->addLog($data);}}/*** 策略工廠策略類*/abstract class AbstractActivityStrategy{abstract public function addLog($data);public static function getInstance($strategyName){return new $strategyName;}}/*** 策略具體類*/class DEFAULTActivityStrategy extends AbstractActivityStrategy {public function addLog($data) {$activityLog = new ActivityLog();$activityLog->save($data);$activityLogAmount = new ActivityLogAmount(); //計數類$activityLogAmount->countValue += 1;$activityLogAmount->save();}}/*** 活動紀錄具體類*/class ActivityLog {public function save($data){echo "save log .<br>";}}/*** 活動計數具體類*/class ActivityLogAmount {public $countValue; //邀請記錄數public function __construct(){$this->countValue = 0;}public function save(){echo " log inc 1";}}$activity = new Activity(null);$activity->addLog();
本文出自 “phper” 部落格,請務必保留此出處http://janephp.blog.51cto.com/4439680/1286700