【趣味设计模式系列】之【观察者模式】
1. 简介
观察者模式(Observer Pattern),也叫做发布订阅模式(Publish-Subscribe),它定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
2. 图解
水果店进口水果销量良好,特别是进口蛇果,目前还没到货,有几个女孩小美、小静、小陶想预定进口蛇果,在到货之前就给水果老板说过,等到货后电话或者微信第一时间通知她们。
3. 案例实现
- 定义预定顾客为观察者接口
Observer
,当收到被观察者通知后,执行update()
方法; - 定义水果店水果为被观察者抽象类
FruitObservable
,持有一个类型为Vector<Observer>
的属性,存放观察者集合,同时定义三个方法addObserver()
,deleteObserver()
,notifyObservers()
,分别为添加预定顾客,删除预定顾客,通知已预订顾客; - 定义
FruitObservable
抽象接口的实现类为进口蛇果ImportedRedDeliciousApple
; - 定义
Observer
接口的实现类为预定进口蛇果的客户类CustomerObserver
;
代码实现如下
客户端测试类
执行结果如下
3. JDK中自带实现与源码分析
- JDK自带接口
Observer
,当收到被观察者通知后,执行update()
方法; - JDK自带接口
Observable
,boolean
类型的属性changed
表示状态是否变化,持有一个类型为Vector<Observer>
的属性obs
; - 定义
Observable
抽象接口的实现类为进口蛇果ImportedRedDeliciousApple
; - 定义
Observer
接口的实现类为预定进口蛇果的客户类CustomerObserver
;
代码实现如下
客户端代码如下
执行结果
源码分析
4. 观察者模式总结
优点
-
观察者和被观察者之间是抽象耦合。
不管是增加观察者还是被观察者都非常容易扩展,而且在Java中都已经实现的抽象层级的定义,所以尽量使用JDK自带的接口。 -
与责任链结合使用
在很多系统中,Observer模式往往和责任链共同负责对于事件的处理,其中的某一个observer负责是否将事件进一步传递。
缺点
观察者模式需要考虑一下开发效率和运行效率问题,一个被观察者,多个观察者,开发和调试就会比较复杂,而且在Java中消息的通知默认是顺序执行,一个观察者卡壳,会影响整体的执行效率。在这种情况下,一般考虑采用异步的方式。
__EOF__

本文作者:小猪爸爸
本文链接:https://www.cnblogs.com/father-of-little-pig/p/11629810.html
关于博主:不要为了技术而技术,总结分享技术,感恩点滴生活!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/father-of-little-pig/p/11629810.html
关于博主:不要为了技术而技术,总结分享技术,感恩点滴生活!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY