|
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,如需转载请自行联系原作者