观察者模式与事件机制本质相同,均实现对象间松耦合通信。被观察者状态变化时通知所有观察者,形成“一对多”依赖。Java中通过Observable与Observer接口实现,后被事件机制扩展,引入事件源、事件对象和监听器,广泛应用于GUI与事件驱动系统。现代Java推荐使用函数式接口或响应式编程替代过时的Observable,提升类型安全与异步处理能力。

观察者模式与事件机制在Java中本质上是同一种设计思想的不同体现,核心都是实现对象间的松耦合通信。当一个对象状态发生变化时,所有依赖它的对象都能自动收到通知,这种“一对多”的依赖关系正是观察者模式的精髓。
观察者模式的基本结构
观察者模式包含两个主要角色:被观察者(Subject)和观察者(Observer)。被观察者维护一个观察者列表,当自身状态改变时,主动通知所有观察者更新。在Java中,可以通过接口或抽象类来定义这些角色。
例如:
- 被观察者实现添加、删除和通知观察者的方法
- 观察者实现一个更新方法,用于接收通知并做出响应
- 一旦被观察者调用通知方法,所有注册的观察者都会执行自己的更新逻辑
Java内置支持:java.util.Observable 与 Observer
Java早期版本提供了 Observable 类和 Observer 接口,简化了观察者模式的实现。虽然从Java 9开始标记为过时,但其设计思路仍有参考价值。
立即学习“Java免费学习笔记(深入)”;
使用方式如下:
- 被观察者继承 Observable 类,并在状态变化后调用 setChanged() 和 notifyObservers()
- 观察者实现 Observer 接口,重写 update() 方法处理通知
- 通过 addObserver() 将观察者注册到被观察者中
事件机制:更贴近实际应用场景的扩展
事件机制可以看作是观察者模式的增强版,广泛应用于GUI编程(如Swing)和事件驱动系统中。它引入了“事件源”、“事件对象”和“监听器”三个概念。
关键点包括:
- 事件源相当于被观察者,负责触发事件
- 事件对象封装了事件发生时的状态信息(如鼠标点击坐标)
- 监听器即观察者,实现特定接口(如 ActionListener),并在对应方法中响应事件
这种方式更加灵活,支持多种类型的事件和监听器,且能传递详细上下文数据。
现代Java中的替代方案
由于 Observable 被弃用,现在推荐使用更现代的方式实现类似功能:
- 通过接口回调实现观察者逻辑
- 利用 Java 8 的函数式接口(如 Consumer、BiConsumer)简化监听器定义
- 在响应式编程中使用 Flow API(Java 9+)或第三方库如 RxJava
这些方法不仅类型安全,还能更好地支持异步处理和链式操作。
基本上就这些。理解观察者模式的关键在于掌握“订阅-通知”机制,而事件机制则是这一思想在复杂场景下的自然延伸。两者都强调解耦和可扩展性,是构建灵活系统的重要工具。










