ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
## 第9章 观察者模式 ### 观察者模式 1. 观察者模式(Observer),当一个对象状态发生改变时,依赖它的对象全部会受到通知,并自动更新 2. 场景:一个事件发送后,要执行一连串更新操作。传统的编程方式,就是在事件的代码之后直接加入处理逻辑。当更新的逻辑增多之后,代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件主体的代码 3. 观察者模式实现了低耦合,非侵入式的通知与更新机制 ### 第一步:传统方法实例 ~~~ // 声明1个事件类 class Event { // 触发事件 function trigger() { echo "Event<br />"; // 添加更新 echo "逻辑1"; echo "逻辑2"; echo "逻辑3"; } } $event = new Event(); $event->trigger(); ~~~ 这种方式,随着项目越来越大,维护起来会越来越难,代码时耦合的、侵入式的。更好的方法是不影响主体部分,这就使用到观察者模式了。 ### 第二步:声明1个事件触发的接口类 *D:\wamp\www\demo\oop\framework\Think\EventGenerator.php* ~~~ <?php namespace Think; abstract class EventGenerator { private $observers = array(); // 添加1个观察者 function addObserver(Observer $observer) { $this->observers[] = $observer; } // 通知观察者,执行更新操作 function notify() { foreach ($this->observers as $observer) { $observer->update(); } } } ~~~ ### 第三步:声明1个观察者的基类 *D:\wamp\www\demo\oop\framework\Think\Observer.php* ~~~ <?php namespace Think; interface Observer { function update($event_info = null); } ~~~ ### 第四步:添加2个观察者逻辑 *D:\wamp\www\demo\oop\framework\index.php* ~~~ class Observer1 implements Think\Observer { function update($event_info = null) { echo "逻辑1<br />"; } } class Observer2 implements Think\Observer { function update($event_info = null) { echo "逻辑2<br />"; } } ~~~ 声明2个观察者继承观察者的接口类,并实现 `update` 的方法 我们的新增加的代码逻辑呢,就分离成为了观察者。 ### 第五步:让事件类触发事件触发的抽象类 *D:\wamp\www\demo\oop\framework\index.php* ~~~ class Event extends Think\EventGenerator { function trigger() { echo "Event<br />"; $this->notify(); } } ~~~ 事件执行完以后,执行基类中的`notify()`通知观察者。 ~~~ $event = new Event(); $event->addObserver(new Observer1); $event->addObserver(new Observer2); $event->trigger(); ~~~