大概说明
如果我希望一个动作在发生的时候,希望订阅他这个动作的所有人都知道了有这么一件事的话,那么就采用观察者模式。
没用观察者模式的情况下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Event { function trigger() { echo "Event update!<br/>";
echo "update1<br/>";
echo "update2<br/>";
} }
$event = new Event;
$event->trigger();
|
这个事件的触发可以看到如果我不断的有新的人需要订阅的话,那么这个 trigger
方法不断的就是要添加新的逻辑和业务。违反了设计模式-开闭原则,就是对修改关闭,对扩展开放的原则。
观察者模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
abstract class EventGenerator { private $observers = array();
function addobserver(Observer $observer) { $this->observers[] = $observer; }
function notify() { foreach ($this->observers as $observer) { $observer->update(); } } }
|
1 2 3 4 5 6
|
interface observer { function update($event_info = null); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
class Observer1 implements observer { function update($event_info = null) { echo "逻辑1<br/>"; } }
class Observer2 implements observer { function update($event_info = null) { echo "逻辑2<br/>"; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| $event = new Event;
$event->addObserver(new Observer1);
$event->addObserver(new Observer2);
$event->trigger();
在这里我们搞明白了,所谓观察者其实就是事件的handler,它和事件怎么挂钩呢,其实是需要注册一下;
$event->addObserver(new Observer1); $event->addObserver(new Observer2);
$event = new Event; $event->trigger();
|
这样子,就只需要注册对应的 handler 到 listered 里面便可以实现主动推送小新给“订阅者”。