php設計模式–策略模式

技術小美發表於2017-11-07
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<?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();

 

本文轉自shayang8851CTO部落格,原文連結:http://blog.51cto.com/janephp/1286700,如需轉載請自行聯絡原作者


相關文章