当一个对象发生改变时,依赖它的对象全部收到通知,并自动更新
场景:一个事件发生后,要执行一连串更新操作。传统的编程方法就是在事件的代码之后直接加入处理逻辑。当更新的逻辑增多之后,代码变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑要修改事件主体代码
观察者模式实现了低耦合,非侵入式的通知与更新机制
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
<?php /** * 观察都接口 */ interface Observer { /** * 每个观察者必须实现一个update方法 * @param type $server_info */ function update($server_info = null); } /** * 事件产生者(抽象类) */ abstract class EventGenerator { /** * 保存观察者 * @var array */ private $observers = array(); /** * 添加一个观察者 * @param Observer $observer */ function addObserver(Observer $observer) { $this->observers[] = $observer; } /** * 通知更新 */ function notify() { foreach ($this->observers as $observer) { $observer->update(); } } } /** * 观察者1 */ class Observer1 implements Observer { function update($server_info = null) { echo "逻辑1\n"; } } /** * 观察都2 */ class Observer2 implements Observer { function update($server_info = null) { echo "逻辑2\n"; } } /** * 事件产生者 */ class Event extends EventGenerator { /** * 触发事件 */ function trigger() { echo "Event\n"; $this->notify(); } } $event = new Event;//实例化事件产生者 $event->addObserver(new Observer1); //添加一个观察者 $event->addObserver(new Observer2); //添加一个观察者 $event->trigger(); //触发一个事件 |