设计模式-观察者模式(Observer)
观察者模式-让你的对象知悉现况,:
定义:观察者模式定义了对象之间一对多的依赖,这样以来,当一个对象改变状态时,它的所有依赖着都会收到通知并且自动更新
这个模式核心点在于其他的模块依赖于或者希望知道某一模块的状态变化,例如现在的微博更新,或者说通俗的来说我们的服务器监控设置,在服务器监控的时候设置了告警接受人,当服务器的状态达到设置条件的时候就要向对应的人员执行相应的通知,就是典型的观察者模式。当你在变更告警接受人的时候其实这个操作相当于变更观察者。在代码中特别是程序中,当各个模块有一对多的依赖,当一个对象状态改变的时候,需要提醒其他模块就用到观察者模式。
PHP有本身已经有自带的观察者接口,我们在此基础上实现一个简单的观察者。
<?php /** * @desc 观察者模式 * PHP有自带的观察者模式接口SplSubject SplObserver 接口 我们就实现一个类 */ /** * 观察者类 */ class OneObserver implements SplObserver{ public function update(SplSubject $subject){ echo __CLASS__.'-'.$subject->getName(); } } class TwoObserver implements SplObserver{ public function update(SplSubject $subject){ echo __CLASS__.'-'.$subject->getName(); } } class ThrObserver implements SplObserver{ public function update(SplSubject $subject){ echo __CLASS__.'-'.$subject->getName(); } } class BaseSubject implements SplSubject{ private $_observers; private $_name; public function __construct($name){ $this->_observers = new SplObjectStorage(); $this->_name = $name; } public function attach(SplObserver $observer){ $this->_observers->attach($observer); } public function detach(SplObserver $observer){ $this->_observers->detach($observer); } public function notify(){ foreach ($this->_observers as $observer){ $observer->update($this); } } public function getName(){ return $this->_name; } } $observerOne = new OneObserver(); $observerTwo = new TwoObserver(); $observerThr = new ThrObserver(); $subject = new BaseSubject('good'); $subject->attach($observerOne); $subject->attach($observerTwo); $subject->attach($observerThr); $subject->notify(); $subject->detach($observerOne); $subject->notify();
简单的一个现实中的开发的例子,例如配置缓存,使用频率很高,同时需要及时获取最新的配置信息,但是每次重新读取需要消耗一定的资源,同时这个配置在多个地方,就是说有多个地方用到这个配置,可能配置的形式有差异,观察者模式就很好的解决这个问题