
本文介绍如何在不修改现有 aevent 和 bevent 类的前提下,通过观察者模式构建统一事件处理器,实现对不同事件类型(如 onaeventcreate/onbeventcreate)的集中响应与协调。
在实际开发中,我们常遇到多个职责相似但接口不一致的事件处理类(如 AEvent 和 BEvent),它们各自定义了语义相同、签名相似但方法名和参数类型不同的回调逻辑(如 onAEventCreate(A) 和 onBEventCreate(B))。若需统一调度、组合触发或执行协同操作,又不能修改原有类——此时,观察者模式(Observer Pattern)结合适配器思想是最自然、低侵入的解决方案。
核心思路是:引入一个中介观察者(EventObserver),它不直接依赖具体事件类的接口,而是通过委托+状态同步机制,将异构事件“收敛”到统一的响应入口。关键在于不对原类做结构性改造,仅通过可选的轻量扩展(如添加 setter 和状态字段)建立通信桥梁。
以下是一个生产就绪的实现示例:
// 1. 统一观察者:负责协调与响应
class EventObserver {
private final AEvent aEvent;
private final BEvent bEvent;
private boolean aCreated = false;
private boolean bCreated = false;
public EventObserver(AEvent aEvent, BEvent bEvent) {
this.aEvent = aEvent;
this.bEvent = bEvent;
// 注册监听(通过扩展方法)
aEvent.setObserver(this);
bEvent.setObserver(this);
}
// 由 AEvent/BEvent 内部调用,通知状态变更
void notifyAEventCreated() {
this.aCreated = true;
checkAndTrigger();
}
void notifyBEventCreated() {
this.bCreated = true;
checkAndTrigger();
}
// 统一响应入口:可根据业务规则灵活定制触发条件
private void checkAndTrigger() {
if (aCreated && bCreated) {
onBothEventsCreated();
// 可选:重置状态以支持多次触发
// aCreated = bCreated = false;
}
}
protected void onBothEventsCreated() {
System.out.println("✅ Both A and B events have been created.");
// 此处编写跨事件的业务逻辑,如发布聚合消息、启动工作流等
}
}对应地,需对 AEvent 和 BEvent 做最小化增强(仅新增两行代码,无逻辑侵入):
class AEvent {
private EventObserver observer;
public void setObserver(EventObserver observer) {
this.observer = observer;
}
public void onAEventCreate(A event) {
// 原有业务逻辑保持不变
System.out.println("Processing A event: " + event);
// 新增:通知观察者
if (observer != null) {
observer.notifyAEventCreated();
}
}
}
class BEvent {
private EventObserver observer;
public void setObserver(EventObserver observer) {
this.observer = observer;
}
public void onBEventCreate(B event) {
// 原有业务逻辑保持不变
System.out.println("Processing B event: " + event);
// 新增:通知观察者
if (observer != null) {
observer.notifyBEventCreated();
}
}
}✅ 优势总结:
- 零侵入原逻辑:onAEventCreate/onBEventCreate 方法体完全保留,仅追加一行通知调用;
- 高内聚低耦合:事件类不感知其他事件,观察者封装所有协调逻辑;
- 可扩展性强:新增 CEvent 时,只需在 EventObserver 中添加对应状态与通知方法,无需重构已有代码;
- 符合开闭原则:对扩展开放(新增事件类型),对修改关闭(不改动旧类核心逻辑)。
⚠️ 注意事项:
- 若事件创建存在并发场景,aCreated/bCreated 应使用 volatile 或 AtomicBoolean 保证可见性;
- setObserver() 调用需确保在事件对象生命周期早期完成(如构造后立即注册);
- 如需支持取消订阅或动态监听,可在 EventObserver 中维护弱引用集合,避免内存泄漏。
该方案本质是“观察者模式 + 状态机”的轻量融合,既规避了反射或泛型擦除带来的复杂性,又比硬编码 if-else 更具可维护性,是解耦异构事件处理的经典实践。










