资讯专栏INFORMATION COLUMN

PHP设计模式

crossea / 2786人阅读

摘要:观察者模式就像订阅报纸,知识名称不太一样出版社改为主题,订阅者称为观察者。观察者模式在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖他的对象就会收到通知,并自动更新。观察者模式定义了对象之间的一对多关系。

[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

相关文章

  • PHP基础

    摘要:分别为适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。设计模式五适配器模式适配器模式将某个对象的接生成器和协程的实现在这篇文章中,作者针对那些比较难以理解的概念,以一个更为通俗的方式去讲明白。。 PHP 源码注解 PHP 的详细源码注解 PHP 字符串操作整理 一些有关字符串的常用操作。 Redis 常见七种使用场景 (PHP 实战) 这篇文章主要介绍利用 R...

    HtmlCssJs 评论0 收藏0
  • PHP 运行模式

    摘要:接下来会对其中五个比较常见的运行模式进行说明。模式是目前主流的服务运行模式,拥有高效可靠的性能,推荐大家使用。由于微软的排他性,只能运行于环境。 SAPI 这里所说的 PHP 运行模式, 其实指的是 SAPI (Server Application Programming Interface,服务端应用编程端口 )。SAPI 为 PHP 提供了一个和外部通信的接口, PHP 就是通过这...

    OnlyMyRailgun 评论0 收藏0
  • php资料集

    摘要:简单字符串缓存实战完整实战种设计模式设计模式是面向对象的最佳实践成为专业程序员路上用到的各种优秀资料神器及框架成为一名专业程序员的道路上,需要坚持练习学习与积累,技术方面既要有一定的广度,更要有自己的深度。 微型新闻系统的开发(PHP 5.4 + MySQL 5.5) 微型新闻系统的开发(PHP 5.4 + MySQL 5.5) 九个很有用的 PHP 代码 php 代码 国内值得关注的...

    RobinQu 评论0 收藏0
  • PHP相关

    摘要:的机器学习库的机器学习库,包括算法交叉验证神经网络等内容。在即将到来的大会上,她将和大家分享在机器学习领域的全新可能。入门总结入门相关,如安装配置基本使用等。 基于 Swoole 开发 PHP 扩展 Swoole-1.9.7 增加了一个新特性,可以基于 Swoole 使用 C++ 语言开发扩展模块,在扩展模块中可以注册 PHP 内置函数和类。现在可以基于 Swoole 来编写 PHP ...

    lewinlee 评论0 收藏0
  • PHP 运行模式与运行原理

    摘要:当客户端请求到达时,进程管理器选择并连接到一个解释器。子进程完成处理后将标准输出和错误信息从同一连接返回。子进程接着等待并处理来自进程管理器运行在中的下一个连接。 目前常见的4种PHP运行模式 CGI通用网关接口模式 FAST-CGI模式 CLI命令行模式 模块模式 运行模式 CGI通用网关接口模式 每有一个用户请求,都会先要创建cgi的子进程,然后处理请求,处理完后结束这个子进程...

    Pocher 评论0 收藏0
  • workerman / 小谈PHP中的几种运行模式

    摘要:话说当下一共有种运行模式,分别是和模块模式。使用,全称进程管理器进行管理。工作原理启动时载入进程管理器进程管理器自身初始化,启动多个解释器进程并等待来自的连接当客户端请求到达时,进程管理器选择并连接到一个解释器。 我们知道 workerman 程序需要在php-cli模式下运行,也就是命令行模式,这块我们有必要了解一下。 话说PHP当下一共有4种运行模式,分别是CGI、FastCGI、...

    darkbaby123 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<