Java设计模式之观察者模式

观察者模式的核心思想特别像现实中的订阅机制。举个例子,你关注了一个网红博主的微博,博主每次发新动态,平台会自动推送给所有粉丝,而你不需要整天手动去刷主页。在编程世界里,这种模式让对象之间建立一种"一对多"的依赖关系:当一个核心对象(称为"主题"或"被观察者")状态变化时,所有依赖它的对象(称为"观察者")会自动收到通知并执行相应操作。这种设计完美解耦了主题和观察者------主题根本不用关心谁在监听它,只管发通知;观察者也只需注册一次,就能长期接收更新。

在Java中实现观察者模式,通常需要四个关键角色。首先是Subject(主题),它定义添加、删除和通知观察者的方法,并维护一个观察者列表。其次是Observer(观察者接口),一般只声明一个update()方法,用于接收主题的通知。接着是ConcreteSubject(具体主题),它继承Subject类,内部维护实际状态数据,当状态改变时调用通知方法遍历观察者列表。最后是ConcreteObserver(具体观察者),实现Observer接口,在update()方法中定义自己的业务逻辑,比如刷新界面或保存日志。

来看个实际代码场景:假设我们在做一个简单的天气预报系统。气象站作为主题,当温度变化时,要自动通知手机APP和户外显示屏这两个观察者。先定义Observer接口:

接着是Subject抽象类,管理观察者集合:

具体主题WeatherStation继承Subject,内部封装温度属性:

两个具体观察者分别实现不同响应逻辑。手机APP观察者:

户外显示屏观察者:

最后在客户端代码中组装整个流程:

运行后会同时输出两条信息,证明两个观察者都收到了通知。如果想新增一个电视终端观察者,只需新建类实现Observer接口并注册到主题,完全不用修改气象站的核心代码。

这种模式的优点很明显。第一是解耦,主题和观察者之间通过接口交互,彼此独立变化。第二是扩展性强,新增观察者无需改动主题代码,符合开闭原则。第三支持广播通信,一次状态更新能触发多个对象响应。但也要注意潜在问题:如果观察者处理太耗时,可能会阻塞主题线程;另外过多的观察者会占用内存,需要合理管理注册与销毁。

实际开发中,观察者模式的应用场景非常广泛。比如Spring框架的事件监听机制,用户注册成功后发布事件,邮件服务和积分服务自动执行;再如Swing GUI中的按钮点击监听,或者消息中间件的发布-订阅模型。Java标准库甚至提供了现成的java.util.Observable类和Observer接口(不过由于设计局限,在Java 9后被标记为过时,更推荐自定义实现)。

说到底,观察者模式把那种"牵一发而动全身"的复杂依赖,变成了清晰可控的订阅关系。下次当你遇到多个对象需要同步状态的场景时,不妨试试这种模式------它能让你的代码像精密的齿轮组一样,一环扣一环地自动运转起来。

相关推荐
George_Ye3 小时前
同一本书,一人一份:我如何设计 AI 个性化扫书报告
设计模式
莫得感情 o13 小时前
设计模式 22 · 三个冷门模式:中介者、访问者、解释器
java·设计模式
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-08-建造者模式(业务实战篇)
java·设计模式·建造者模式·架构设计·对象构建
AustinXu1 天前
从 Claude Code 到 Claude Tag,Harness Engineering 走到了组织这一层
设计模式·团队管理
剧中有戏1 天前
单例模式从入门到精通:一个数据库连接池的完整剖析
设计模式
胡萝卜术1 天前
编译期与运行期的双重防线:从 TypeScript 类型之争到 LLM 输出的自动化择优
前端·设计模式·面试
货拉拉技术1 天前
重塑 Agent 度量衡:基于 LLM-as-a-Judge 的离线评估体系与实践
算法·设计模式
KhalilRuan1 天前
设计模式小记
设计模式
卡牌RWA研究院2 天前
Relique:一张精品卡牌如何从收藏品变成可交易的链上资产?
设计模式·金融·区块链·创业创新
剧中有戏2 天前
抽象工厂模式从入门到精通:一个多云存储案例的完整剖析(修订版)
设计模式