java中用接口结合观察者模式实现事件通知的核心是解耦通知方与响应方:通知方仅依赖eventlistener接口,响应方仅实现该接口;通过泛型可增强类型安全,结合spring事件机制可进一步交由框架管理。

Java 中用接口结合观察者模式实现事件通知,核心是把“谁来通知”和“谁来响应”完全分开——通知方只依赖抽象的观察者接口,不关心具体是谁在监听;响应方只实现接口,不依赖通知方的具体类。这样修改一方逻辑,另一方几乎不用动。
定义统一的事件观察者接口
先设计一个通用的观察者接口,比如 EventListener,它声明一个接收事件的方法:
interface EventListener {
void onEvent(Object event);
}
这个接口非常轻量,不绑定具体业务,任何类只要实现它,就能成为观察者。比如订单服务、日志服务、缓存清理服务,都可以各自实现自己的 onEvent 逻辑,互不影响。
被观察者(事件源)持有接口引用,不持有具体实现
事件发布者(如 OrderService)内部维护一个 List
- 注册监听:用 addListener(EventListener listener) 把实现类加进列表
- 触发通知:遍历列表,对每个 listener 调用 onEvent(event)
- 不 new 具体监听器,也不 import 监听器的具体类名
这样一来,新增一个短信通知模块?只需写个 SmsNotificationListener 实现接口,再注册进去即可——OrderService 的代码一行都不用改。
用泛型增强类型安全(可选但推荐)
为避免运行时类型转换错误,可以把接口升级为泛型:
interface EventListener
void onEvent(T event);
}
比如定义 EventListener
配合 Spring 事件机制更进一步解耦(实际项目常用)
如果项目已用 Spring,可以直接基于 ApplicationEvent 和 @EventListener 注解:
- 自定义事件继承 ApplicationEvent
- 监听方法标注 @EventListener,Spring 自动注入并异步/同步分发
- 发布方只调用 applicationEventPublisher.publishEvent(...),彻底不感知监听者存在
这种方案连观察者列表管理都交给框架,真正实现“发布即忘”,适合中大型系统。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











