首先来看个栗子:

//事件classEventDemo{//触发了新事件publicfunctiontrigger(){echo"Eventhappening\r";echo"后续业务更新逻辑1\r\n";echo"后续业务更新逻辑2\r\n";echo"后续业务更新逻辑3\r\n";}}


场景:当事件发生变化时,触发其他业务进行相关的操作

特征1.所有业务代码都是***式的,直接放置于核心业务当中。

2.耦合度太高,不便于管理维护。需要一件一件事去做处理。



于是我们可以这样假设:

假如后续业务都是都是该事件的关注者,当事件发生改变,只需要通知到观察者即可。其他的工作由观察者自行完成。

类似发布--订阅这种模式。



代码实现:

步骤1.定义观察者接口

步骤2.定义观察者类

步骤3.定义事件产生器(抽象类)

步骤4.定义事件场景类(继承并实现事件产生器抽象类)

步骤5.实例化运用
实例化事件场景-->添加观察者-->通知




定义观察者接口

/***定义观察者接口(观察对象为事件发生者)*InterfaceObserver*/interfaceObserver{/***事件发生时,进行更新操作*@paramnull$eventInfo发生事件的信息*@returnmixed*/publicfunctionupdate($eventInfo=null);}

定义观察者类

//定义多个观察者classObserver1implementsObserver{publicfunctionupdate($eventInfo=null){echo"观察者1:准备开始{$eventInfo}<br>\r\n";}}classObserver2implementsObserver{publicfunctionupdate($eventInfo=null){echo"观察者2:准备开始{$eventInfo}<br>\r\n";}}


定义事件产生器(抽象类)

/***事件产生者(抽象类)*ClassEventGenerator*/abstractclassEventGenerator{private$observers=[];//事件的所有观察者/***增加观察者*@returnmixed*/publicfunctionaddObserver(Observer$observer){$this->observers[]=$observer;}/***通知事件发生了,其他观察者接到通知后更新业务逻辑*@returnmixed*/publicfunctionnotify($eventInfo){foreach($this->observersas$observer){$observer->update($eventInfo);}}}


定义事件场景类(继承并实现事件产生器抽象类)

/***定义事件类(继承事件产生者类)*ClassEvent*/classEventextendsEventGenerator{publicfunctiontrigger($eventInfo){echo"事件:{$eventInfo}即将发生,通知观察者们做好更新准备<br>\r\n";$this->notify($eventInfo);echo"<br/>";}}


主业务场景的实现

$event=newEvent();//此处可以动态添加、删除观察者$event->addObserver(newObserver1());//$event->addObserver(newObserver2());//此处可以发生任意多个事件$event->trigger('吃饭');$event->trigger('喝水');$event->trigger('走路');


至此,我们可以看到在主业务场景中,只需要简单的管理(添加、删除)观察者,管理(添加、删除)发生事件就可以实现简化代码逻辑,减少耦合完成任务。更好的好处是,业务代码解耦合,便于后期的维护扩展。