java观察者模式核心是被观察者状态变化时主动通知注册的观察者,实现松耦合;自java9起observable/observer被弃用,推荐用copyonwritearraylist自定义实现、completablefuture、flow api或reactor/rxjava等响应式方案。

Java 中观察者模式(Observer Pattern)的事件通知,核心是让被观察者(Subject)在状态变化时主动通知所有已注册的观察者(Observer),从而实现松耦合的事件响应机制。Java 早期在 java.util 包中提供了 Observable 类和 Observer 接口,但自 Java 9 起已被标记为 deprecated,官方推荐使用更灵活、线程安全且功能丰富的替代方案,比如 java.util.concurrent.CopyOnWriteArrayList 配合自定义接口,或响应式框架(如 Project Reactor、RxJava)。
用自定义 Observer/Subject 实现基础事件通知
这是最常用、可控性最强的方式,不依赖过时 API,也便于理解原理:
- 定义一个观察者接口(如
EventListener),声明回调方法(如onEvent(Object event)) - 被观察者类维护一个观察者列表(推荐
CopyOnWriteArrayList,避免遍历时并发修改异常) - 提供
register()、unregister()和notifyObservers()方法 - 状态变更后调用
notifyObservers(),逐个触发观察者的回调
示例片段:
public interface EventListener {
void onStateChange(String newState);
}
public class DataSubject {
private final List<eventlistener> listeners = new CopyOnWriteArrayList();
private String state;
public void setState(String state) {
this.state = state;
notifyListeners();
}
public void register(EventListener listener) {
listeners.add(listener);
}
public void unregister(EventListener listener) {
listeners.remove(listener);
}
private void notifyListeners() {
listeners.forEach(l -> l.onStateChange(state));
}
}
</eventlistener>
用 CompletableFuture 或 Flow API 实现异步/背压通知
适合需要非阻塞、支持异步处理或流式数据的场景:
-
CompletableFuture可用于“一次性”事件(如任务完成通知),通过thenAccept()等链式方法响应 - JDK 9+ 的
java.util.concurrent.Flow(Reactive Streams 规范实现)支持多订阅、背压、取消等,适用于高吞吐事件流 - 典型结构:被观察者是
Flow.Publisher,观察者实现Flow.Subscriber,通过subscription.request(n)控制数据节奏
借助第三方库简化开发
若项目已引入响应式生态,可直接使用成熟实现:
-
Project Reactor:用
Mono(单事件)或Flux(多事件)发布事件,观察者用subscribe()接收 -
RxJava:类似,
Observable或Flowable发布,Observer订阅 -
Guava EventBus:基于注解(
@Subscribe)的轻量级事件总线,适合模块内解耦,但不支持泛型事件类型推导
注意事项与最佳实践
避免常见陷阱,提升健壮性:
- 观察者列表操作需线程安全 ——
CopyOnWriteArrayList是简单有效的选择;若频繁修改,考虑读写锁 - 防止内存泄漏:观察者持有被观察者引用时,建议使用弱引用(
WeakReference)存储,或显式调用注销 - 异常隔离:单个观察者抛异常不应中断其他观察者执行,可用 try-catch 包裹回调调用
- 避免在通知过程中修改观察者列表(如回调里调用 unregister),否则可能引发
ConcurrentModificationException(CopyOnWriteArrayList可缓解)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











