前言知识是作为观察者所获得的结论,经过科学训练的观察者会为我们提供所有可感知的现实。观察者模式旨在让对象跟踪某个状态并知道状态何时发生变化。一旦状态发生变化,所有订阅的对象都可以得到通知。如果需要保证一个状态的一致性(例如:状态触发的应用),但是这个给定的状态可能有多个不同的用户级别,这种情况下观察者模式就非常适用和有帮助,各司其职。可以使用观察者模式维护一致性,同时跟踪有多少对象创建了给定状态。观察者模式很直观。为什么要让多个对象创建或跟踪给定状态呢?如果一个对象完成工作然后通知可能使用该状态的其他对象,那就更合理了。使用SPL实现观察者模式1.观察者设计模式中可以使用的三个SPL接口/类如下:●SplSubject●SplObserver●SplObjectStorage1.1,SplSubjectstorage[]=$observer;}//删除方法publicfunctiondetach(SplObserver$observer){if(is_int($idx=array_search($observer,$this->storage))){unset($this->storage[$idx]);注意:如果直接使用PHP类库的SplObjectStorage类,则不需要阅读1.3,只需要修改$this->observers=newSplObjectStorage();在1.4中对于$this->observers=new\SplObjectStorage();(原因可以去PHP的解决命名空间和文件加载机制,参考资料),notify方法中的$this->observers->storage改为$this->observers。1.4、SPL具体主题SplSubject接口不包含获取方法和设置方法,但这也是观察者设计模式的一部分,所以需要添加获取方法和设置方法。设置方法setData()包含一个参数,可以是要添加的任何类型的数据。getter方法getData()存储当前的主题状态,特定观察者使用它来更新观察者数据。还添加了setObservers()方法。没有在构造函数中设置SplObjectStorage()实例,也没有在setData()方法中设置观察者实例,而是在这里实现了一个单独的setObservers()方法,以提供更容易的耦合并允许多组观察者。observers=newSplObjectStorage();}//添加观察者publicfunctionattach(SplObserver$observer){$this->observers->attach($observer);}//移除观察者publicfunctiondetach(SplObserver$observer){$this->observers->detach($observer);}//notifynotifypublicfunctionnotify(){foreach($this->observers->storageas$key=>$observer){$observer->update($this);}}}//设置方法publicfunctionsetData($dataNow){$this->data=$dataNow;}//获取方法publicfunctiongetData(){return$this->data;}}?>1.5,用于SPL特定的观察者用于实现更新函数来更新关联的观察者实例。getData()."";}}?>(额外的普通用户特定观察者)1.6,SPLclient"SPL"Client类只是一个标准的客户端。该客户端根据SPL接口向特定主体和观察者发送多个请求,但自身不实现SPL类和接口。创建一个新的具体观察者,一个新的具体主体:";$ob1=newConcreteObserver();$ob2=newConcreteObserver();$ob3=newConcreteObserver();$Subject=newConcreteSubject();$Subject->setObservers();$Subject->setData("这是你的数据!");$主题->附加($ob1);$Subject->attach($ob2);$Subject->attach($ob3);$主题->通知();echo"
