php - 观察者模式
2015-12-16 22:13 折翼的鸟 阅读(227) 评论(0) 编辑 收藏 举报如果你修改某一个组件会引起其它组件一连串的改变,那么开发任务会变成产生bug和消除bug的恶性循环。
当然系统中的组件必然包含着对其它组件的引用,然而我们使用不同的策略来尽量减少。
举个例子,假如有一个负责用户登录的类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | class login{ public function handleLogin( $user , $pass , $ip ){ // 登录判断 return true; } } 如果有一天增加需求,比如说:记录所有登录的IP,那我们就得这样 class login{ public function handleLogin( $user , $pass , $ip ){ // 登录判断 // 登录成功之后记录IP return true; } } 如果考虑到安全问题,登录失败要发送一封邮件给admin,那就接着增加发送邮件方法 class login{ public function handleLogin( $user , $pass , $ip ){ // 登录判断 // 登录成功之后记录IP // 失败发送邮件给admin return true; } } |
以上都是我们很容易满足的需求,但是会破坏我们原有的设计,而且这个方法会无限增大,并且复杂,所以我们如果用观察者模式来实现最合适不过了。
观察者模式的核心就是把客户元素(观察者)从一个中心类(主体)中分离出来。当主体知道事件发生时,观察者需要被通知到。同时我们并不希望主体和观察者之间的关系进行硬编码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | <?php // 定义观察接口 interface Observable{ public function attach(Observer $observer ); public function detach(Observer $observer ); public function notify(); } class Login implements Observable{ private $_observer ; public function attach(Observer $observer ){ $this ->_observer[] = $observer ; } public function detach(Observer $observer ){ $result = array_search ( $observer , $this ->_observer); if ( $result !== false){ unset( $this ->_observer[ $observer ]); } } public function notify(){ foreach ( $this ->_observer as $key => $value ) { $value ->update(); } } } interface Observer{ public function update(); } class Sendemail implements Observer{ public function update(){ echo '我要发送邮件' ; } } class SendSms implements Observer{ public function update(){ echo '我要发送短信' ; } } $login = new Login(); $login ->attach( new Sendemail); $login ->attach( new SendSms); $login ->notify(); ?> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构