java实现观察者模式推荐自定义接口,定义observer接口和subject抽象类,用copyonwritearraylist管理观察者并线程安全通知,支持lambda注册与泛型事件,复杂场景可选eventbus或rxjava等替代方案。

Java 中实现观察者模式,核心是定义观察者(Observer)和被观察者(Subject)之间的松耦合通知机制:当被观察者状态改变时,自动通知所有已注册的观察者。JDK 自带的 java.util.Observable 和 java.util.Observer 已在 Java 9+ 中被弃用,现在推荐手写接口或使用第三方库(如 RxJava),但最常用、最清晰的方式是自定义接口实现。
定义观察者接口和被观察者抽象类
先设计两个核心契约:一个供观察者实现,一个供被观察者管理订阅与通知。
- 定义 Observer 接口,含
update(Subject subject, Object data)方法,接收通知源和可选数据 - 定义 Subject 抽象类(或接口),提供
register(Observer o)、remove(Observer o)、notifyObservers(Object data)等方法 - 实际业务类继承
Subject并在状态变更处调用notifyObservers()
手动实现一对可复用的通用观察者组件
避免每次重复写集合管理逻辑,可封装一个线程安全的基础实现:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 用
CopyOnWriteArrayList<observer></observer>存储观察者,支持并发注册/移除且遍历时不抛ConcurrentModificationException -
notifyObservers()中逐个调用update(),建议捕获单个观察者异常,避免一个失败中断全部通知 - 可扩展支持泛型事件类型(如
notifyObservers(T event)),提升类型安全
使用 Lambda 或匿名内部类简化观察者注册
业务代码中无需定义完整类,直接传入行为逻辑即可:
- 若
Observer是函数式接口(仅一个抽象方法),可用 Lambda 表达式注册:subject.register((s, d) -> System.out.println("收到:" + d)); - 也可用方法引用:
subject.register(this::onUpdate);,前提是this::onUpdate签名匹配update() - 注意:Lambda 观察者无法在运行时移除,除非保存引用;需移除时建议用命名对象或持有弱引用
替代方案:考虑事件总线或响应式流
对于复杂场景,自定义观察者易陷入状态管理混乱,可转向更成熟的模型:
- Guava EventBus:基于注解自动发现监听器,支持异步、粘性事件,适合模块间解耦
-
RxJava / Project Reactor:以
Observable或Flux为核心,天然支持背压、线程切换、组合操作 -
Spring ApplicationEvent:在 Spring 容器内使用,配合
@EventListener,自动管理生命周期与事务上下文
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










