首先来看个栗子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
//事件
class
EventDemo
{
//触发了新事件
public
function
trigger()
{
echo
"Event happening\r"
;
echo
"后续业务更新逻辑1\r\n"
;
echo
"后续业务更新逻辑2\r\n"
;
echo
"后续业务更新逻辑3\r\n"
;
}
}
|
场景:当事件发生变化时,触发其他业务进行相关的操作
特征1.所有业务代码都是入侵式的,直接放置于核心业务当中。
2.耦合度太高,不便于管理维护。需要一件一件事去做处理。
于是我们可以这样假设:
假如后续业务都是都是该事件的关注者,当事件发生改变,只需要通知到观察者即可。其他的工作由观察者自行完成。
类似发布--订阅这种模式。
代码实现:
步骤1.定义观察者接口
步骤2.定义观察者类
步骤3.定义事件产生器(抽象类)
步骤4.定义事件场景类(继承并实现事件产生器抽象类)
步骤5.实例化运用
实例化事件场景-->添加观察者-->通知
定义观察者接口
1
2
3
4
5
6
7
8
9
10
11
12
13
|
/**
* 定义观察者接口(观察对象为事件发生者)
*Interface Observer
*/
interface
Observer
{
/**
* 事件发生时,进行更新操作
* @param null $eventInfo 发生事件的信息
* @return mixed
*/
public
function
update(
$eventInfo
= null);
}
|
定义观察者类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
//定义多个观察者
class
Observer1
implements
Observer
{
public
function
update(
$eventInfo
= null)
{
echo
"观察者1:准备开始{$eventInfo}<br> \r\n"
;
}
}
class
Observer2
implements
Observer
{
public
function
update(
$eventInfo
= null)
{
echo
"观察者2:准备开始{$eventInfo}<br> \r\n"
;
}
}
|
定义事件产生器(抽象类)
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
|
/**
* 事件产生者(抽象类)
* Class EventGenerator
*/
abstract
class
EventGenerator
{
private
$observers
= [];
//事件的所有观察者
/**
* 增加观察者
* @return mixed
*/
public
function
addObserver(Observer
$observer
)
{
$this
->observers[] =
$observer
;
}
/**
* 通知事件发生了,其他观察者接到通知后更新业务逻辑
* @return mixed
*/
public
function
notify(
$eventInfo
)
{
foreach
(
$this
->observers
as
$observer
) {
$observer
->update(
$eventInfo
);
}
}
}
|
定义事件场景类(继承并实现事件产生器抽象类)
1
2
3
4
5
6
7
8
9
10
11
12
13
|
/**
* 定义事件类(继承事件产生者类)
* Class Event
*/
class
Event
extends
EventGenerator
{
public
function
trigger(
$eventInfo
)
{
echo
"事件 :{$eventInfo} 即将发生,通知观察者们做好更新准备<br>\r\n"
;
$this
->notify(
$eventInfo
);
echo
"<br/>"
;
}
}
|
主业务场景的实现
1
2
3
4
5
6
7
8
9
10
11
12
|
$event
=
new
Event();
//此处可以动态添加、删除观察者
$event
->addObserver(
new
Observer1());
//$event->addObserver(new Observer2());
//此处可以发生任意多个事件
$event
->trigger(
'吃饭'
);
$event
->trigger(
'喝水'
);
$event
->trigger(
'走路'
);
|
至此,我们可以看到在主业务场景中,只需要简单的管理(添加、删除)观察者,管理(添加、删除)发生事件就可以实现简化代码逻辑,减少耦合完成任务。更好的好处是,业务代码解耦合,便于后期的维护扩展。
本文转自 hgditren 51CTO博客,原文链接:http://blog.51cto.com/phpme/2046280,如需转载请自行联系原作者