- 浏览: 828997 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
xieye:
jetty插件有好几个版本,1.6,1.7,1.8
我选的是用 ...
tapestry入门(翻译)3 导入项目到eclipse -
xieye:
还有,
注:第2部分时,需要先安装jetty,我自己在安装过程 ...
tapestry入门(翻译)3 导入项目到eclipse -
xieye:
说明一下:实际使用中,导入时我并没有错误。2、我把eclips ...
tapestry入门(翻译)3 导入项目到eclipse -
xieye:
其实还是有一些先决条件的。1是外部环境,2是进步是阶段性的(意 ...
(转载文章)如何愉悦起来:一位精神治疗师的见解 -
mandy_yanzi:
我都已经饿7天了坚持为了我的衣衣
身体健康的问题
我的设计模式系列文章
php设计模式(1)-- 观察者模式 -- spl标准写法
php设计模式(2)-- 观察者模式 -- 用trait来改进的写法
php设计模式(3)-- 责任链(职责链)模式
php设计模式(4)-- 装饰器模式
本文讲观察者模式。
部分代码来源:
https://www.ibm.com/developerworks/cn/opensource/os-cn-observerspl/
概述
个人的心得体会:最重要的一点,目标对象,给观察者对象发通知时,不需要对方的返回值,仅仅把通知下发就完事。
这是最重要的。如果需要返回,不应该用这个设计模式。
php内建了SplSubject 和 SplObserver 接口以及一个方便的SplObjectStorage类。
SplSubject 接口 需要实现3个方法:
abstract public void attach ( SplObserver $observer ) 添加(注册)一个观察者
abstract public void detach ( SplObserver $observer ) 删除一个观察者
abstract public void notify ( void ) 当状态发生改变时,通知所有观察者
SplObserver接口需要实现一个方法
abstract public void update ( SplSubject $subject ) 在目标发生改变时接收目标发送的通知;当关注的目标调用其 notify()时被调用
分析
下面构造一个需求,用户修改密码后,对其发送两种通知,一个是email通知,一个是手机短信通知。
分析需求,
1、不需要通知的返回值。
2、当目标发生状态变化时(密码修改),有多个后续处理,这时特别适合观察者。
3、监听器和目标的功能是比较分离的,不是紧密关联的。一个是发通知,一个是改数据库,这样可以借助设计模式来分解业务逻辑。
4、一般,添加监听器的代码,放在客户端代码里写。
代码实现
总共4个文件,
User.php, 目标对象
MobileSender.php,某个监听器对象
EmailSender.php,某个监听器对象
Client.php,客户端代码,
在这个设计模式中,客户端代码还有添加监听器。
User.php
MobileSender.php
EmailSender.php
Client.php:
效果展示
在命令行,输入php Client.php,展示如下:
php设计模式(1)-- 观察者模式 -- spl标准写法
php设计模式(2)-- 观察者模式 -- 用trait来改进的写法
php设计模式(3)-- 责任链(职责链)模式
php设计模式(4)-- 装饰器模式
本文讲观察者模式。
部分代码来源:
https://www.ibm.com/developerworks/cn/opensource/os-cn-observerspl/
概述
个人的心得体会:最重要的一点,目标对象,给观察者对象发通知时,不需要对方的返回值,仅仅把通知下发就完事。
这是最重要的。如果需要返回,不应该用这个设计模式。
php内建了SplSubject 和 SplObserver 接口以及一个方便的SplObjectStorage类。
SplSubject 接口 需要实现3个方法:
abstract public void attach ( SplObserver $observer ) 添加(注册)一个观察者
abstract public void detach ( SplObserver $observer ) 删除一个观察者
abstract public void notify ( void ) 当状态发生改变时,通知所有观察者
SplObserver接口需要实现一个方法
abstract public void update ( SplSubject $subject ) 在目标发生改变时接收目标发送的通知;当关注的目标调用其 notify()时被调用
分析
下面构造一个需求,用户修改密码后,对其发送两种通知,一个是email通知,一个是手机短信通知。
分析需求,
1、不需要通知的返回值。
2、当目标发生状态变化时(密码修改),有多个后续处理,这时特别适合观察者。
3、监听器和目标的功能是比较分离的,不是紧密关联的。一个是发通知,一个是改数据库,这样可以借助设计模式来分解业务逻辑。
4、一般,添加监听器的代码,放在客户端代码里写。
代码实现
总共4个文件,
User.php, 目标对象
MobileSender.php,某个监听器对象
EmailSender.php,某个监听器对象
Client.php,客户端代码,
在这个设计模式中,客户端代码还有添加监听器。
User.php
<?php class User implements SplSubject { private $email; private $username; private $mobile; private $password; /** * @var SplObjectStorage */ private $observers = NULL; public function __construct($email, $username, $mobile, $password) { $this->email = $email; $this->username = $username; $this->mobile = $mobile; $this->password = $password; $this->observers = new SplObjectStorage(); } public function attach(SplObserver $observer) { $this->observers->attach($observer); } public function detach(SplObserver $observer) { $this->observers->detach($observer); } public function notify() { foreach ($this->observers as $observer) { $observer->update($this); } } // 这是业务逻辑 public function changePassword($newPassword) { echo __METHOD__, PHP_EOL; $this->password = $newPassword; $this->notify(); } // 专门给监听器的信息,也可以省略,然后对每个字段添加get方法 public function get_observer_info(){ return [ "email" => $this->email, "mobile" => $this->mobile, "username" => $this->username, "password" =>$this->password, ]; } }
MobileSender.php
<?php class MobileSender implements SplObserver { public function update(SplSubject $subject) { $userInfo = $subject->get_observer_info(); // 真正的发送短信代码略。 echo "向 手机{$userInfo['mobile']} 发送短信成功。短信内容是:你好 {$userInfo['username']}" . "你的新密码是 {$userInfo['password']},请妥善保管", PHP_EOL; } }
EmailSender.php
<?php class EmailSender implements SplObserver { public function update(SplSubject $subject) { $userInfo = $subject->get_observer_info(); // 真正的发送邮件代码略。 echo "向 {$userInfo['email']} 发送电子邮件成功。内容是:你好 {$userInfo['username']}" . "你的新密码是 {$userInfo['password']},请妥善保管", PHP_EOL; } }
Client.php:
<?php header('Content-Type: text/plain'); function __autoload($class_name) { require_once "$class_name.php"; } //定义目标对象 $user = new User('user1@domain.com', '张三', '13610002000', '123456'); // 添加监听器在客户端, $email_sender = new EmailSender(); $mobile_sender = new MobileSender(); $user->attach($email_sender); $user->attach($mobile_sender); // 然后在对目标执行动作,顺序必须是先添加监听器,然后对象操作。 $user->changePassword('654321');
效果展示
在命令行,输入php Client.php,展示如下:
User::changePassword 向 user1@domain.com 发送电子邮件成功。内容是:你好 张三你的新密码是 654321,请妥善保管 向 手机13610002000 发送短信成功。短信内容是:你好 张三你的新密码是 654321,请妥善保管
发表评论
-
召唤神龙 - 安装 centos 8, php 8, mysql 8, laravel 8 的整套 php 运行环境
2020-11-27 16:26 665本文编写时间:2020-11-27 传说集齐龙珠可以召唤神 ... -
centos8 使用阿里镜像快速安装php7.4套件
2020-11-15 00:48 797centos8 使用阿里镜像快速安装php7.4套件 本文只 ... -
centos7 使用阿里镜像快速安装php7.4套件
2020-11-15 00:32 1195本文只考虑centos7 今日 2020-11-16 rem ... -
composer常用命令
2020-11-05 14:46 1422列出当前全局配置 composer config -l -g ... -
期待centos8+php8 + mysql8 + laravel8,8888
2020-10-29 19:24 477期待centos8+php8 + mysql8 目前主要使用 ... -
ubuntu 安装 php7.4以及各类插件
2020-10-24 13:20 1069ubuntu 安装 php7.4以及各类插件 安装系统 最近 ... -
宝塔定义站点
2020-02-24 10:41 2宝塔定义站点。 1111111111111111111111 ... -
让php-fpm以root账号运行
2020-02-19 21:41 806一般来说,我们没有这种需求,但是当需要时, 可以让php-fp ... -
将代码部署到coding.net
2020-01-10 14:20 625coding.net 是一个git仓库,有免费有收费。 首先 ... -
php部署工具deployer技巧 - vendor目录创建
2020-01-06 12:06 882deployer是个好东西,可是每次都composer ,其实 ... -
自定义redis多个实例
2020-01-04 01:17 642假如多个项目部署到同一台服务器,有时会被redis的各项目前缀 ... -
推荐使用php的部署工具 deployer
2020-01-03 16:48 876php部署代码可以使用 https://deployer.or ... -
使用composer 类库 cachetool 清除opcache 的缓存
2020-01-03 16:38 956php的生产服务器上,需要把opche打开。 但有时,会被缓 ... -
laravel容器学习体会
2019-12-31 15:11 647根据文档与实测结果 假设我在app下建一个Services目 ... -
phalcon 自定义超强日志类
2019-12-18 10:00 819phalcon自带的日志文件类,有两个麻烦之处。 1、路径不能 ... -
自定义后台的使用
2019-12-18 05:22 414如果自己写后台,保存用户的表单请求值 所有的情况如下: 1 ... -
phalcon 自定义事件使用的多种方式
2019-12-16 20:43 774方法1:官方文档的方式。 这是控制器: public ... -
phalcon对控制器返回值的使用以输出json
2019-12-16 19:17 812在phalcon里,控制器的Action的方法的返回值没啥用。 ... -
phalcon数据库DB使用实例
2019-12-12 17:12 690整理了一下phalcon的db使用,写了个demo。 ... -
php-redis5.0降级成php-redis4.3
2019-08-22 00:01 884最新版本的php的redis插件,版本是5.0 但是可能会有 ...
相关推荐
PHP SPL(Standard PHP Library)库包含了对多种设计模式的实现,其中包括观察者模式。观察者模式是一种行为设计模式,允许一个对象,称为观察者,监视另一个对象,即主题,以便当主题的状态改变时,观察者可以自动...
u-boot-sunxi-with-spl-vga
《Linux SPL-PUB 开发指南1》是一份详细介绍如何在Linux环境下进行SPL-PUB(Secondary Program Loader - Public)开发的文档。SPL-PUB是嵌入式系统启动过程中的关键部分,它负责加载主引导加载器,为系统的初始化...
### 超微X11SPL-F主板用户手册知识点详解 #### 一、前言与免责声明 在深入了解超微X11SPL-F主板的各项功能之前,首先需要明确手册中的前言部分提及的重要信息: - **免责声明**:制造商虽然尽力确保手册中信息的...
MS-BCS-SPL一种新的压缩感知重构算法,相比TVAL3要好的多
抽象类、接口、契约式编程开始讲起,然后介绍了静态方法、单例模式、工厂模式和PHP 6 的新特性等内容,接着介绍了测试和文档方面的内容,还介绍了标准PHP 库SPL 方面的知识以及PHP 开发人员最有可能用到的MVC 模式,...
### 超微 X12SPL-LN4F 主板用户手册知识点解析 #### 一、产品概述 **超微 X12SPL-LN4F** 是一款由 Super Micro Computer, Inc. (以下简称“Supermicro”)设计并制造的高性能服务器主板。此主板面向专业级应用市场...
深入研究"SPL06-001 demo code",开发者不仅可以学习到如何操作SPL06-001硬件,还可以了解到无人机控制软件的设计原则和最佳实践。这将为那些希望构建或改进自己的无人机项目的人提供宝贵的资源。
SCSI(Small Computer System Interface)架构模型5(SAM-5)和SAS协议层5(SPL-5)是现代存储系统中两个至关重要的规范,它们定义了高速数据传输的标准和协议。理解这两个概念对于从事IT行业,尤其是存储解决方案...
这个压缩包中的MATLAB代码,可以帮助用户了解BCS-SPL的工作原理,通过调整不同的参数,观察其对图像压缩质量和速率的影响。同时,对于想要进一步研究和改进压缩感知算法的研究者来说,这是一个很好的起点。 标签中...
从这些知识点可以看出,SPL06-001气压传感器是一款功能丰富、特化设计的传感器,其设计目的是为了满足在无人机等行业应用中对高精度气压测量的需求。正确理解和应用文档中的每一个知识点,有助于最大限度地发挥该...
基于时空相关性的分布式压缩感知多假设预测重构算法,能较好地改善视频序列的重建质量。
歌尔声学SPL06-001芯片
SPL运行原理 SPL作为一个数据访问平台,最终以DLL的方式体现,那么系统只要引用SPL的DLL就可以开始应用了。 SPL将依赖于两个XML配置文件:数据源配置文件(以下我称之为DatabaseMap.xml)和实体映射文件(以下称之为...
- 电流消耗:在不同模式下有不同的功耗指标,待机模式下低于1μA。 - 温度传输函数和压力传输函数:分别描述了如何根据读取的传感器输出计算对应的温度和气压值。 - 定时特性:描述了芯片的时间响应特性,包括数据...
PHP的标准库SPL(SPL全称为Standard PHP Library)提供了一套现成的接口和类来实现观察者模式,简化了代码编写。本文将深入探讨如何使用SPL实现观察者模式,并通过一个具体的登录处理示例进行说明。 首先,我们需要...
在开发过程中,随手翻译了一部分,该芯片007和001应该是差不多的,气压计可以用在四轴飞行器上,分享给大家,希望对大家有用!
SPL06-001气压计和LIS3DH加速度计的IIC驱动。IIC是hal库的IO模拟,亲测可用。不是完整工程,复制粘贴就可用。有详细注释。 SPL06好多人都说精度是0.05m,但数据手册上说的相对精度是0.5米,绝对精度接近10米。 通过...
在【SPL编译原理词法分析课程设计】中,我们关注的是如何为SPL语言构建一个词法分析器。 SPL是一种简化版的编程语言,它的设计目的是教学和测试编译器的基本概念。由于其结构清晰简单,包含了一些高级语言的语法...