//事件 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.实例化运用
实例化事件场景-->添加观察者-->通知
定义观察者接口
/** * 定义观察者接口(观察对象为事件发生者) *Interface Observer */ interface Observer { /** * 事件发生时,进行更新操作 * @param null $eventInfo 发生事件的信息 * @return mixed */ public function update($eventInfo = null); }
定义观察者类
//定义多个观察者 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"; } }
定义事件产生器(抽象类)
/** * 事件产生者(抽象类) * 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); } } }
定义事件场景类(继承并实现事件产生器抽象类)
/** * 定义事件类(继承事件产生者类) * Class Event */ class Event extends EventGenerator { public function trigger($eventInfo) { echo "事件 :{$eventInfo} 即将发生,通知观察者们做好更新准备<br>\r\n"; $this->notify($eventInfo); echo "<br/>"; } }
主业务场景的实现
$event = new Event(); //此处可以动态添加、删除观察者 $event->addObserver(new Observer1()); //$event->addObserver(new Observer2()); //此处可以发生任意多个事件 $event->trigger('吃饭'); $event->trigger('喝水'); $event->trigger('走路');
至此,我们可以看到在主业务场景中,只需要简单的管理(添加、删除)观察者,管理(添加、删除)发生事件就可以实现简化代码逻辑,减少耦合完成任务。更好的好处是,业务代码解耦合,便于后期的维护扩展。
原文地址:http://blog.51cto.com/phpme/2046280