摘要:观察者模式就像订阅报纸,知识名称不太一样出版社改为主题,订阅者称为观察者。观察者模式在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖他的对象就会收到通知,并自动更新。观察者模式定义了对象之间的一对多关系。
[TOC]
依赖注入 策略模式 单例模式 观察者模式 观察者模式我们来看看报纸和杂志的订阅是怎么回事:
报社的业务就是出版报纸。
向某家报社订阅报纸,只要他们有新报纸出版,就会给你送来。
当你不想再看报纸的时候,取消订阅,他们就不会再送新报纸来。
只要报社还再运营,就会一直有人向他们订阅报纸或者取消订阅报纸。
观察者模式就像订阅报纸,知识名称不太一样:出版社改为“主题”(Subject),订阅者称为“观察者”(Observer)。实现观察者模式的方式不只一种,但是包含Subject和Observer接口的类设计的做法最常见。
主题可以注册、注销观察者,当数据改变时,可以通知观察者;所有的观察者必须继承观察者接口,这个接口只有一个update()方法,当主题的状态被改变时调用。主题继承 SplSubject,这个是PHP内置观察者模式主题接口;观察者继承SplObserver;同时,主题中用SplObjectStorage来存储观察者列表。
这个是主题:
observers = new SplObjectStorage(); } /** * 注册观察者 * * Attach an SplObserver * @link https://php.net/manual/en/splsubject.attach.php * @param SplObserver $observer* The SplObserver to attach. *
* @return void * @since 5.1.0 */ public function attach(SplObserver $observer) { $this->observers->attach($observer); } /** * 注销观察者 * * Detach an observer * @link https://php.net/manual/en/splsubject.detach.php * @param SplObserver $observer* The SplObserver to detach. *
* @return void * @since 5.1.0 */ public function detach(SplObserver $observer) { $this->observers->detach($observer); } /** * 通知观察者 * Notify an observer * @link https://php.net/manual/en/splsubject.notify.php * @return void * @since 5.1.0 */ public function notify() { // 循环调用观察者自身的update方法 if ($this->observers->count() > 0) { /** @var SplObserver $observer */ foreach ($this->observers as $observer) { $observer->update($this); } } } /** * 数据改变,同时通知观察者 * * @param $upd_data */ public function updData($upd_data) { $this->upd_data = $upd_data; // 当数据改变时,再需要通知观察者的地方调用 notify $this->notify(); } /** * 消息改变,同时通知观察者 * * @param $upd_msg */ public function updMsg($upd_msg) { $this->upd_msg = $upd_msg; // 这个 notify 也可以不写在方法中,灵活运用 $this->notify(); } /** * @return mixed */ public function getUpdData() { return $this->upd_data; } /** * @return mixed */ public function getUpdMsg() { return $this->upd_msg; } }
有一个猫猫观察者:
* The SplSubject notifying the observer of an update. * * @return void * @since 5.1.0 */ public function update(SplSubject $subject) { // 这个 $subject 一开始比较难理解,最后发现确实很聪明 // 我觉得这种实现方式最好,具体要得到哪些更新,由注册观察者的主题决定 // 观察者不知道主题的细节,只知道实现了观察者接口 /** * @var Subject $subject */ $listen_data = $subject->getUpdData(); $listen_msg = $subject->getUpdMsg(); echo "I am 猫猫观察者,I get new data:" . $listen_data . ";msg:" . $listen_msg; echo "
"; } }
还有一个狗狗观察者:
getUpdData(); $listem_msg = $subject->getUpdMsg(); echo "I am 狗狗观察者,data:" . $listen_data . ";msg:" . $listem_msg; echo "
"; } }
来看一下调用吧:
attach($catObserver); $subject->attach($dogObserver); // 主题有所变化,观察者得到对应的变化 $subject->updData(12); $subject->updMsg("你妈妈喊你回家吃饭");
显示结果:
I am 猫猫观察者,I get new data:12;msg:还不该吃饭 I am 狗狗观察者,data:12;msg:还不该吃饭 I am 猫猫观察者,I get new data:12;msg:你妈妈喊你回家吃饭 I am 狗狗观察者,data:12;msg:你妈妈喊你回家吃饭
把我的例子弄懂,你也应该能理解观察者模式了。
来看一下你学到了什么:
00原则--对象之间松耦合设计。
观察者模式--在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖他的对象就会收到通知,并自动更新。
观察者模式定义了对象之间的一对多关系。
观察者不知道观察者的细节,也不知道主题的细节,只知道实现了观察者接口。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/29748.html
摘要:接下来会对其中五个比较常见的运行模式进行说明。模式是目前主流的服务运行模式,拥有高效可靠的性能,推荐大家使用。由于微软的排他性,只能运行于环境。 SAPI 这里所说的 PHP 运行模式, 其实指的是 SAPI (Server Application Programming Interface,服务端应用编程端口 )。SAPI 为 PHP 提供了一个和外部通信的接口, PHP 就是通过这...
摘要:当客户端请求到达时,进程管理器选择并连接到一个解释器。子进程完成处理后将标准输出和错误信息从同一连接返回。子进程接着等待并处理来自进程管理器运行在中的下一个连接。 目前常见的4种PHP运行模式 CGI通用网关接口模式 FAST-CGI模式 CLI命令行模式 模块模式 运行模式 CGI通用网关接口模式 每有一个用户请求,都会先要创建cgi的子进程,然后处理请求,处理完后结束这个子进程...
摘要:话说当下一共有种运行模式,分别是和模块模式。使用,全称进程管理器进行管理。工作原理启动时载入进程管理器进程管理器自身初始化,启动多个解释器进程并等待来自的连接当客户端请求到达时,进程管理器选择并连接到一个解释器。 我们知道 workerman 程序需要在php-cli模式下运行,也就是命令行模式,这块我们有必要了解一下。 话说PHP当下一共有4种运行模式,分别是CGI、FastCGI、...
阅读 3114·2021-11-24 09:39
阅读 3109·2021-10-21 09:38
阅读 2372·2019-08-29 15:28
阅读 3656·2019-08-26 12:23
阅读 2583·2019-08-26 12:19
阅读 1318·2019-08-23 12:44
阅读 2078·2019-08-23 12:02
阅读 939·2019-08-22 17:05