PHP设计模式之观察者模式
使用场景
假设项目经理让我们写了一个登陆接口,咔咔擦擦写完了
- 第二天让我们加入统计登陆次数,然后在后面加代码
- 第三天让我们判断登陆地区,又在后面加代码
- 第四天让我们在用户登陆后推送活动,再再后面加代码
- 第N天,这个接口已经杂乱到没人想维护了
我们需要让项目保持高内聚低耦合,就可以用到观察者模式(也不是非要,看需求)
概念
观察者,观察者,首先要有个被人观察的角色,这是唯一的,然后会有无数个观察者去看她,可以说是一群人在围观一个人,既然有无数个观众,那总得有个东西记录有哪些观察者,那就应该有一个类似于数组一样来储存所有观察者,总结就是一个被观察者,无数个观察者,再有一个容器记录
代码示例
- 接口示例
Subject就是被观察者,Observer就是观众,也就是观察者
被观察者
Action实现了被观察者接口,他现在就是被观察者,再定义一个$_observers数组,他就是记录观众的容器了。
首先实现register方法,用它传入一个观察者,然后塞到数组里,再实现notify()方法,它会遍历容器数组,执行每个观察者的watch()方法。
观察者
这里定义了三个观察者,全都实现了Observer接口,前面的Subject会循环调用每个观察者的watch()方法,所以我们需要实现每个观察者的watch()方法。
调用
首先new被观察者对象,执行它的register()方法,把每个观察者都放入容器数组,最后执行notify()方法,通知所有观察者执行自己的方法。
PHP原生自带的观察者模式
PHP有自带的观察者模式
- splsubject接口 - 被观察者
- Observer接口 - 观察者
- SplObjectStorage对象 - 容器
首先我们有一个用户登录类
让他实现splsubject接口成为被观察者。
- 首先在构造函数里,让他new SplObjectStorag()对象并赋值到属性上方便后面调用
- 实现attach()方法,用来注册观察者
- 实现detach()方法,用来删除观察者
- 实现notify()方法,用来遍历容器,调用每个观察者的update方法(必须是update)
- rewind方法是容器指针重置到最开始,valid方法检测容器是否遍历完成并返回布尔,current方法是获取当前的观察者,next方法是将指针后移一位
- 修改login()方法,在里面调用notify()来通知观察者事件完成了
观察者
每个观察者实现SplObserver接口,并实现update()方法
应用
__EOF__

本文作者:织梦行云
本文链接:https://www.cnblogs.com/cxfs/p/13412923.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/cxfs/p/13412923.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)