php 观察者模式

观察者模式也可以叫做是发布-订阅模式,他的核心是当一个对象发生改变时,依赖他的对象都会得到通知。典型实现方式是:
定义两个接口:观察者接口(需要同时执行的行为)和被观察者接口(主要进行的操作)
定义两个类:分别实现上面两个接口。
被观察者类注册自己需要通知的观察者
被观察者类类某个业务逻辑发生时通知观察者对象,每个观察者执行自己的业务逻辑。
php代码基本实现:

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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#===================定义观察者、被观察者接口============

/**

*

* 观察者接口(通知接口)

*

*/

interface ITicketObserver //观察者接口

{

function onBuyTicketOver($sender, $args); //得到通知后调用的方法

}

/**

*

* 主题接口

*

*/

interface ITicketObservable //被观察对象接口

{

function addObserver($observer); //提供注册观察者方法

}

#====================主题类实现========================

/**

*

* 主题类(购票)

*

*/

class HipiaoBuy implements ITicketObservable { //实现主题接口(被观察者)

private $_observers = array (); //通知数组(观察者)

public function buyTicket($ticket) //购票核心类,处理购票流程

{

// TODO 购票逻辑

//循环通知,调用其onBuyTicketOver实现不同业务逻辑

foreach ( $this->_observers as $obs ){

$obs->onBuyTicketOver ( $this, $ticket ); //$this 可用来获取主题类句柄,在通知中使用

}

}

//添加通知

public function addObserver($observer) //添加N个通知

{

$this->_observers [] = $observer;

}

}

#=========================定义多个通知====================

//短信日志通知

class HipiaoMSM implements ITicketObserver {

public function onBuyTicketOver($sender, $ticket) {

echo (date ( 'Y-m-d H:i:s' ) . " 短信日志记录:购票成功:$ticket<br>");

}

}

//文本日志通知

class HipiaoTxt implements ITicketObserver {

public function onBuyTicketOver($sender, $ticket) {

echo (date ( 'Y-m-d H:i:s' ) . " 文本日志记录:购票成功:$ticket<br>");

}

}

//抵扣卷赠送通知

class HipiaoDiKou implements ITicketObserver {

public function onBuyTicketOver($sender, $ticket) {

echo (date ( 'Y-m-d H:i:s' ) . " 赠送抵扣卷:购票成功:$ticket 赠送10元抵扣卷1张。<br>");

}

}

#============================用户购票====================

$buy = new HipiaoBuy ();

$buy->addObserver ( new HipiaoMSM () ); //根据不同业务逻辑加入各种通知

$buy->addObserver ( new HipiaoTxt () );

$buy->addObserver ( new HipiaoDiKou () );

//购票

$buy->buyTicket ( "一排一号" );



//打印:2018-07-27 10:43:48 短信日志记录:购票成功:一排一号

// 2018-07-27 10:43:48 文本日志记录:购票成功:一排一号

// 2018-07-27 10:43:48 赠送抵扣卷:购票成功:一排一号 赠送10元抵扣卷1张。