1
PHP观察者模式
Posted by 撒得一地 on 2016年2月24日 in PHP笔记
上一篇: PHP原型模式
下一篇: PHP转义emoji表情,将其存入utf8数据库
下一篇: PHP转义emoji表情,将其存入utf8数据库
观察者模式(Observer),当一个对象状态发生改变时,依赖它的对象全部会收到通知,并自动更新。
场景:一个事件发生后,要执行一连串更新操作。传统的编程方式,就是在事件的代码之后直接加入处理逻辑。当更新的逻辑增多之后,代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件主体的代码。
观察者模式实现了低耦合,非侵入式的通知与更新机制。
观察者模式UML图:
下面先介绍传统的事件更新通知的实现操作。
class Event { function trigger() { echo "Event update!<br/>"; //具体更新逻辑 echo "update1<br/>"; echo "update2<br/>"; // ... } } $event = new Event; $event->triger();
这种方法的坏处是当更新通知逻辑越来越多时,trigger方法的代码就会越变越多,越来越复杂,不易维护。而且这种方法,事件和更新机制是耦合在一起的。其实,事件和更新操作本是不一样的业务模块,这种方法属于侵入式的编程方法。
下面介绍低耦合的观察者模式的具体实现方法:
//声明一个抽象的事件发生者基类 abstract class EventGenerator{ private $observers = array(); //添加观察者方法 function addobserver(Observer $observer) { $this->observers[] = $observer; } //对每个添加的观察者进行事件通知 function notify() { //对每个观察者逐个去更新 foreach($this->observers as $observer) { $observer->update(); } } }
//声明一个观察者接口 interface observer { function update($event_info = null); }
//声明具体事件类,继承了主事件 class Event extends EventGenerator { function trigger() { echo "Event<br/>"; $this->notify(); } }
//声明多个观察者 class Observer1 implements observer { function update($event_info = null) { echo "逻辑1<br/>"; } } class Observer2 implements observer { function update($event_info = null) { echo "逻辑2<br/>"; } } //...更多的观察者类 //主逻辑代码 $event = new Event; $event->addObserver(new Observer1); $event->addObserver(new Observer2); $event->trigger();
输出结果:
Event 逻辑1 逻辑2
观察者模式的方法使得事件和更新操作很好的进行了分离,使两者实现了低耦合。而且很容易动态的添加和删除某一项观察者逻辑操作。
本文固定地址:http://coderschool.cn/1625.html,转载请注明出处。
上一篇: PHP原型模式
下一篇: PHP转义emoji表情,将其存入utf8数据库
下一篇: PHP转义emoji表情,将其存入utf8数据库
1 Comment
11