当前位置: 首页 > 后端技术 > Node.js

PHP设计模式——观察者模式

时间:2023-04-03 11:01:45 Node.js

前言知识是作为观察者所获得的结论,经过科学训练的观察者会为我们提供所有可感知的现实。观察者模式旨在让对象跟踪某个状态并知道状态何时发生变化。一旦状态发生变化,所有订阅的对象都可以得到通知。如果需要保证一个状态的一致性(例如:状态触发的应用),但是这个给定的状态可能有多个不同的用户级别,这种情况下观察者模式就非常适用和有帮助,各司其职。可以使用观察者模式维护一致性,同时跟踪有多少对象创建了给定状态。观察者模式很直观。为什么要让多个对象创建或跟踪给定状态呢?如果一个对象完成工作然后通知可能使用该状态的其他对象,那就更合理了。使用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"

删除ob3,结果是ob1和ob2的Notification:

";$主题->分离($ob3);$主题->通知();echo"

剩余数据和追加数据,删除ob2,结果为ob1和ob3注意:

";$Subject->setData("更多数据,只需要ob1和ob3");$Subject->attach($ob3);$主题->分离($ob2);$主题->通知();echo"

剩余数据和追加新数据,结果ob1和ob3有“新数据”通知:

”;$主题->附加(新的\common\observer\UserObserver);$主题->通知();}}?>1.7,Client调用的输出如下:call:$worker=newcommonobserverClient();output:summaryanalysisSplObjectStorage类是我自己写的,贴出来分享一下PHP5.1.0及以上版本有很多特性,其中一个就是提供了一套接口,可以用于观察者设计模式。您可以研究如何使用它,SplObserver接口以及SplSubject和SplObjectStorage接口。使用这些接口,很容易构建观察者模式。“SPL”是StandardPHPLibrary(标准PHP库)的缩写,它包括一组解决标准问题的接口和类。参考手册相关资料关于观察者模式使用SPL快速实现观察者设计模式PHPSPL标准库数据结构对象容器(SplObjectStorage)