当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
观察者模式类似于订阅,当有消息时,被订阅者会把消息推送给多个订阅者,从而改变订阅者的某些行为。类似的,观察者模式分为观察者被观察者,被观察者(即主题)发生某些行为时,向观察者发送消息从而改变观察者的行为等。
举个例子:
我们定义一个接口Isubject, 用来定义被观察者(主题)的行为:
interface Isubject { function regiterObserver($observer); function removeObserver($observer); function notifyObservers();
}function run();
具体化Isubject接口class Subject implements Isubject { private static $observers; function regiterObserver($observer) { self::$observers[] = $observer; } function removeObserver($observer) { $index = array_search($observer); unset(self::$observers[$index]); } function notifyObservers() { foreach (self::$observers as $v) { $v->update(); } } function run() { echo '被观察者行为改变'; $this->notifyObservers(); } }
再定义一个观察者接口 Ioserver 用来定义观察者的行为,interface Iobserver { function update(); }
接下来 创建两个类 继承Ioserver接口 表示 两个观察者,分别为First 和 Secondclass First implements Iobserver { function update() { echo PHP_EOL,'first',PHP_EOL; } } class Second implements Iobserver { function update() { echo 'second',PHP_EOL; } }
最后模拟行为实例化被观察者(主题),然后将first,second两个实例注册成观察者,当subject 执行run 发生动作时(即输出 '被观察者行为改变'),向所有的观察者发送消息(执行update),执行不同的操作。$first = new First(); $second = new Second(); $subject = new Subject(); $subject->regiterObserver($first); $subject->regiterObserver($second); // $subject->run();
输出结果同样可以注册3,4设置更多的观察者,只需要函数将它们注册为观察者即可被观察者行为改变 first second