Java观察者模式推荐自定义接口实现,通过定义含回调方法的观察者接口、被观察者维护观察者列表并通知、观察者实现接口处理业务逻辑,以及函数式接口简化单事件监听。

在 Java 的观察者模式中,接口用于定义监听回调方法,核心是让观察者(Observer)能统一接收被观察者(Subject)的状态变化通知。Java 8 之前有内置的 java.util.Observer 和 java.util.Observable,但已过时且功能受限;现代写法推荐**自定义接口**,更灵活、类型安全、符合函数式编程习惯。
定义观察者接口(含回调方法)
用 interface 声明一个观察者契约,其中声明一个或多个回调方法,参数通常包含事件源(Subject)和事件数据(如状态、变更对象等):
- 方法名建议语义清晰,例如
onUpdate()、onChange()或handleEvent() - 参数尽量使用具体类型,避免泛型擦除带来的不安全(如用
OrderEvent而非裸Object) - 可添加默认方法支持扩展行为(如日志、空实现),减少子类负担
示例:
public interface OrderObserver {
void onOrderPlaced(Order order); // 订单创建回调
void onOrderShipped(Order order); // 发货回调
default void onError(String message) {
System.err.println("Observer error: " + message);
}
}
被观察者维护并通知观察者列表
Subject 类持有观察者集合(如 List<orderobserver></orderobserver>),提供注册(addObserver)、移除(removeObserver)和通知(notifyXXX)方法:
- 通知逻辑中遍历列表,调用对应接口方法(如
observer.onOrderPlaced(order)) - 注意线程安全:若多线程操作,可用
CopyOnWriteArrayList或同步块 - 避免通知过程中修改观察者列表(如回调内移除自身),否则可能抛
ConcurrentModificationException
观察者实现接口并处理业务逻辑
具体观察者只需实现接口,专注自身响应逻辑,与被观察者解耦:
public class EmailNotificationService implements OrderObserver {
@Override
public void onOrderPlaced(Order order) {
sendEmail("订单已创建:" + order.getId());
}
<pre class="brush:php;toolbar:false;">@Override
public void onOrderShipped(Order order) {
sendEmail("订单已发货:" + order.getId());
}
private void sendEmail(String content) { /* 实际邮件发送 */ }}
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
多个观察者可同时注册,同一事件触发各自独立逻辑(发短信、存日志、更新库存等)。
配合函数式接口简化单方法监听
若只监听一种事件(如仅关注状态变更),可用 @FunctionalInterface 定义简洁回调:
@FunctionalInterface
public interface StateChangeListener<t> {
void onStateChanged(T newState);
}</t>
使用时可直接传 lambda:
subject.addStateListener(state -> System.out.println("新状态:" + state));
这种写法轻量、易测试,适合事件驱动或响应式场景。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










