一般通知
当不用观察者模式的时候,我们需要一个一个的通知对象更新。
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
| <?php
/** * 观察者1 */ class Observer1 { function update($event_info = 'Observer1') { echo "逻辑$event_info<br/>"; } }
/** * 观察者2 */ class Observer2 { function update($event_info = 'Observer2') { echo "逻辑$event_info<br/>"; } }
class Event { function trigger() { $observer1 = new Observer1; $observer1->update();
$observer2 = new Observer2; $observer2->update(); } }
$event = new Event(); $event->trigger();
|
什么是观察者模式
当一个对象状态发生改变时,依赖它的对象全部会收到通知,并自动更新。
将观察者添加进事件对象列表,可以添加、删除,然后轮询通知
观察者接口类
1 2 3 4 5 6 7 8
| <?php /** * 观察者接口 */ interface Observer { function update($event_info = null); }
|
观察事件通知
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
| <?php
require 'Observer.php';
/** * 事件 */ abstract class EventGenerator { private $observers = [];
/** * 添加观察者 */ function addObserver($key, Observer $observer) { $this->observers[$key] = $observer; }
/** * 删除观察者 */ function removeObserver($key) { unset($this->observers[$key]); }
/** * 事件通知 */ function notify() { foreach ($this->observers as $key => $observer) { $observer->update(); } } }
|
测试
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
| <?php
require 'EventGenerator.php';
class Event extends EventGenerator {
function trigger() { echo "Event".__METHOD__."<br/>"; $this->notify(); } }
/** * 观察者1 */ class Observer1 implements Observer { function update($event_info = 'Observer1') { echo "逻辑$event_info<br/>"; } }
/** * 观察者2 */ class Observer2 implements Observer { function update($event_info = 'Observer2') { echo "逻辑$event_info<br/>"; } }
$event = new Event(); $event->addObserver('Observer1', new Observer1); $event->addObserver('Observer2', new Observer2); $event->trigger();
|
输出
1 2 3
| EventEvent::trigger 逻辑Observer1 逻辑Observer2
|