PHP中的观察者模式介绍
2020-04-07 18:59
671 查看
观察者模式
描述:
这个观察者模式,大家可以去翻阅一下PHP手册中的这两个接口,下面我的代码是根据这两个接口来实现的
在公司上,我也有遇到过需要观察者模式的,就好比如,众多商品小表修改完之后,要统计在商品大表,这时候就可以考虑观察者模式了
PHP中的接口如下:SplSubject,SPLObserver
第一个使用场景
当报纸发布消息, 每一个用户都会得到通知。这就是观察者模式的使用场景。
第二个应用场景
下完订单后,比如赠送什么什么东西
注册完后,比如赠送什么什么东西
第三个使用场景
场景描述:
哈票以购票为核心业务(此模式不限于该业务),但围绕购票会产生不同的其他逻辑,如:
1、购票后记录文本日志
2、购票后记录数据库日志
3、购票后发送短信
4、购票送抵扣卷、兑换卷、积分
5、其他各类活动等
传统解决方案:在购票逻辑等类内部增加相关代码,完成各种逻辑。
存在问题:
1、一旦某个业务逻辑发生改变,如购票业务中增加其他业务逻辑,需要修改购票核心文件、甚至购票流程。
2、日积月累后,文件冗长,导致后续维护困难。
存在问题原因主要是程序的"紧密耦合",使用观察模式将目前的业务逻辑优化成"松耦合",达到易维护、易修改的目的,
同时也符合面向接口编程的思想。
[code]<?php // php 实现观察者 // php5中提供观察者observer与被观察者subject的接口 // user ab 是被观察 // SplSubject 实现这个接口就要实现三个方法 class user implements SplSubject { public $lognum; public $hobby; protected $observers = null; public function __construct($hobby) { $this->lognum = rand(1, 10); $this->hobby = $hobby; $this->observers = new SplObjectStorage(); } /*** * 登录 */ public function login() { // 操作session $this->notify();// 调用了,将观察的东西都给我通知! } // 1 第一个方法 附加,附加一个SplObserver,以便可以将其通知更新。 public function attach(SPLObserver $observer) { $this->observers->attach($observer); } // 2 第二个方法 分离,将观察者从主题上移开,不再通知其更新。 public function detach(SPLObserver $observer) { $this->observers->detach($observer); } // 3 第三个方法 通知,通知所有附加的观察者。 public function notify() { $this->observers->rewind(); // rewind 里面存储了很多要通知的对象, 将迭代器后退到第一个存储元素 // valid 不断判断里面的对象 // current 获取里面的对象 // update 接收主题更新 // next 下一个 while ($this->observers->valid()) { $observer = $this->observers->current(); $observer->update($this); $this->observers->next(); } } } // 登录安全的 class secrity implements SPLObserver { public function update(SplSubject $subject) { // TODO: Implement update() method. if ($subject->lognum < 3) { echo "这是第" . $subject->lognum . '次安全登录'; } else { echo "这是第" . $subject->lognum . '次安全,异常'; } } } // 对应的人返回对应的需求 class ad implements SPLObserver { public function update(SplSubject $subject) { // TODO: Implement update() method. if ($subject->hobby == 'sports') { echo '台球英锦赛门票预订'; } else { echo '好好学习,天天向上'; } } } // 实施观察 $user = new user('study'); $user->attach(new secrity());// 观察它 $user->attach(new ad()); // 观察它 $user->login();
- 点赞 2
- 收藏
- 分享
- 文章举报
相关文章推荐
- PHP设计模式之观察者模式(Observer)详细介绍和代码实例
- PHP设计模式之观察者模式(Observer)详细介绍和代码实例
- PHP 设计模式之观察者模式介绍
- PHP设计模式之观察者模式(Observer)详细介绍和代码实例
- php 面向对象开发中的观察者模式介绍
- PHP观察者模式示例【Laravel框架中有用到】
- PHP 设计模式之观察者模式
- 简单介绍PHP的责任链编程模式
- PHP单例模式详细介绍
- 简单介绍php编程单一入口和多入口模式(案例)
- php中的设计模式之--观察者模式
- PHP设计模式实例之(观察者模式、策略模式、简单工厂模式)
- PHP观察者模式定义与用法实例分析
- php设计模式介绍之伪对象模式
- 设计模式介绍:观察者模式(observer)
- PHP多例模式介绍
- [PHP] 看博客学习观察者模式
- php设计模式入门-观察者模式
- java观察者模式介绍
- ruby、javascript、php中的观察者模式实现代码