摘要:设计观察者模式是为了让一个对象跟踪某个状态,知道状态何时改变,一旦状态改变,所有订阅对象都能得到通知。类与观察者设计模式没有内在的关系,不过通过它其内置的和方法可以很方便的将观察者实例与一个主题实例相关联以及解除关联。
前言
知识就是作为观察者所获得的结论,经过科学培训的观察者会为我们提供所有能感知的现实。设计观察者模式是为了让一个对象跟踪某个状态,知道状态何时改变,一旦状态改变,所有订阅对象都能得到通知。如果需要保证一个状态的一致性(比如说:状态触发类的应用),但是这个给定状态可能有多个不同的用户等级,这种情况下观察者模式就很适用,而且很有帮助,各司其职。利用观察者模式可以维护一致性,同时记录创建一个给定的状态的对象个数。
观察者模式很直观。何必让多个对象创建或跟踪一个给定的状态呢?如果由一个对象完成这个工作,然后通知其他可能用到这个状态的对象,这样会合理得多。
使用SPL实现观察者模式1、可用于观察者设计模式的3个SPL接口/类如下:
● SplSubject
● SplObserver
● SplObjectStorage
1.1、SplSubject
注意这个SplSubject 接口指定attach()和detach()方法参数中$observer的数据类型必须是一个SplObserver 对象。
1.2、SplObserver
SplObserver 接口只有一个update()方法,如下所示:
update()方法对于观察者模式至关重要,因为它会得到Subject状态的最新变化,并交给观察者实例。
1.3、SplObjectStorage
SplObjectStorage 类与观察者设计模式没有内在的关系,不过通过它其内置的attach()和detach()方法可以很方便的将观察者实例与一个主题实例相关联以及解除关联。
storage[] = $observer; } //删除方法 public function detach(SplObserver $observer) { if(is_int($idx = array_search($observer, $this->storage))) { unset($this->storage[$idx]); } } }注释:如果直接用PHP类库的SplObjectStorage类的话,1.3可以不看了,只需要把1.4里面的$this->observers = new SplObjectStorage();修改为$this->observers = new SplObjectStorage();(原因可以去了下PHP的解命名空间和文件加载机制。参考资料),notify方法里的$this->observers->storage修改为$this->observers即可。
1.4、SPL具体主题
SplSubject接口不包括获取方法和设置方法,不过这也是观察者设计模式中的一部分,所以需要增加获取方法和设置方法。设置方法setData()包含一个参数,这是要增加的任何类型的数据。获取方法getData()存储当前的主题状态,由具体观察者用来更新观察者数据。
另外还增加了setObservers()方法。并不是在构造函数中设置SplObjectStorage()实例,也没有在setData()方法中设置观察者实例,这里实现了一个多带带的setObservers()方法,可以提供更轻松的耦合,并允许有多组观察者。observers = new SplObjectStorage(); } //添加观察者 public function attach(SplObserver $observer) { $this->observers->attach($observer); } //剔除观察者 public function detach(SplObserver $observer) { $this->observers->detach($observer); } //通知notify public function notify() { foreach ($this->observers->storage as $key =>$observer) { $observer->update($this); } } //设置方法 public function setData($dataNow) { $this->data=$dataNow; } //获取方法 public function getData() { return $this->data; } } ?>1.5、SPL具体观察者
用于实现更新函数来更新关联的观察者实例。
getData().""; } } ?>(附加的普通用户具体观察者)
1.6、SPL客户
“SPL”Client 类只是一个标准客户。这个客户按照SPL接口向具体主题和观察者发出多个请求,不过自己并没有实现SPL类和接口。
创造新的具体观察者,新的具体主体:"; $ob1 = new ConcreteObserver(); $ob2 = new ConcreteObserver(); $ob3 = new ConcreteObserver(); $Subject = new ConcreteSubject(); $Subject->setObservers(); $Subject->setData("这是你的数据!"); $Subject->attach($ob1); $Subject->attach($ob2); $Subject->attach($ob3); $Subject->notify(); echo "删除ob3,结果是ob1和ob2的通知:
"; $Subject->detach($ob3); $Subject->notify(); echo "剩余的数据和附加数据还有删除ob2,结果是ob1和ob3的通知:
"; $Subject->setData("更多的数据,只有ob1和ob3是需要的"); $Subject->attach($ob3); $Subject->detach($ob2); $Subject->notify(); echo "剩余数据和附加新数据,结果是ob1和ob3还有“新数据”的通知:
"; $Subject->attach(new commonobserverUserObserver); $Subject->notify(); } } ?>1.7、Client的调用输出如下:
调用:$worker=new commonobserverClient();
输出:
总结分析这里SplObjectStorage类是我自己写的,贴出来分享一下。PHP5.1.0以及更高的版本有很多特性,其中之一就是提供了一组可以用于观察者的设计模式的接口。可以研究一下怎么使用,SplObserver接口以及SplSubject和SplObjectStorage接口,利用这些接口,构建观察者模式简直易如反掌。“SPL”是标准PHP类库(Standard PHP Library)的简写,这个库中包括一组解决标准问题的接口和类。参考手册
相关资料关于观察者模式
利用 SPL 快速实现 Observer 设计模式
PHP SPL标准库之数据结构对象容器(SplObjectStorage)
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/66500.html
摘要:概念观察者模式属于行为模式,是定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。观察者模式符合接口隔离原则,实现了对象之间的松散耦合。 概念 观察者模式属于行为模式,是定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。 当一个对象状态发生改变后,会影响到其他几个对象的改变,这...
摘要:设计观察者模式是为了让一个对象跟踪某个状态,知道状态何时改变,一旦状态改变,所有订阅对象都能得到通知。类与观察者设计模式没有内在的关系,不过通过它其内置的和方法可以很方便的将观察者实例与一个主题实例相关联以及解除关联。 前言 知识就是作为观察者所获得的结论,经过科学培训的观察者会为我们提供所有能感知的现实。设计观察者模式是为了让一个对象跟踪某个状态,知道状态何时改变,一旦状态改变,所有...
摘要:设计观察者模式是为了让一个对象跟踪某个状态,知道状态何时改变,一旦状态改变,所有订阅对象都能得到通知。类与观察者设计模式没有内在的关系,不过通过它其内置的和方法可以很方便的将观察者实例与一个主题实例相关联以及解除关联。 前言 知识就是作为观察者所获得的结论,经过科学培训的观察者会为我们提供所有能感知的现实。设计观察者模式是为了让一个对象跟踪某个状态,知道状态何时改变,一旦状态改变,所有...
摘要:我们今天也来做一个万能遥控器设计模式适配器模式将一个类的接口转换成客户希望的另外一个接口。今天要介绍的仍然是创建型设计模式的一种建造者模式。设计模式的理论知识固然重要,但 计算机程序的思维逻辑 (54) - 剖析 Collections - 设计模式 上节我们提到,类 Collections 中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了...
阅读 3947·2021-10-19 13:23
阅读 2326·2021-09-09 11:37
阅读 2506·2019-08-29 15:20
阅读 3406·2019-08-29 11:08
阅读 1660·2019-08-26 18:27
阅读 1763·2019-08-23 12:20
阅读 3027·2019-08-23 11:54
阅读 2543·2019-08-22 15:19