
本文介绍如何在不修改现有 aevent 和 bevent 类的前提下,通过观察者模式统一处理不同事件的创建逻辑,实现类型无关、低耦合的事件监听机制。
在实际开发中,我们常遇到需要对多个异构事件类(如 AEvent 和 BEvent)执行相似响应逻辑(例如“事件创建后触发统一校验或通知”),但又无法修改其源码的约束场景。此时,强行抽象基类或引入泛型方法往往因签名差异(onAEventCreate(A) vs onBEventCreate(B))而失效。观察者模式(Observer Pattern) 正是解决此类“松耦合通知”问题的经典方案——它将事件发布者与处理者解耦,允许外部监听器被动响应变化,且无需改动被监听类的核心结构。
关键在于最小化侵入性改造:仅需为 AEvent 和 BEvent 添加轻量级状态标记与观察者注册能力,而非重构其业务方法。以下是推荐实现:
// 1. 定义统一事件监听器
class EventObserver {
private final AEvent aEvent;
private final BEvent bEvent;
public EventObserver(AEvent aEvent, BEvent bEvent) {
this.aEvent = aEvent;
this.bEvent = bEvent;
// 注册自身为观察者(仅需各调用一次)
aEvent.setObserver(this);
bEvent.setObserver(this);
}
// 响应任一事件创建
public void onEventCreated() {
// 可按需扩展策略:单事件触发、双事件聚合、计数阈值等
if (aEvent.isCreated() && bEvent.isCreated()) {
onBothEventsCreated();
}
}
protected void onBothEventsCreated() {
System.out.println("✅ Both AEvent and BEvent are now created.");
// 执行统一业务逻辑:如发布消息、更新状态、触发工作流等
}
}
// 2. 对 AEvent 的最小化增强(仅新增两行)
class AEvent {
private boolean isCreated = false;
private EventObserver observer;
public void setObserver(EventObserver observer) {
this.observer = observer;
}
public boolean isCreated() { return isCreated; }
public void onAEventCreate(A event) {
// 原有业务逻辑保持不变
System.out.println("Processing A event: " + event);
// 新增:标记状态并通知观察者
this.isCreated = true;
if (observer != null) observer.onEventCreated();
}
}
// 3. 对 BEvent 同理增强
class BEvent {
private boolean isCreated = false;
private EventObserver observer;
public void setObserver(EventObserver observer) {
this.observer = observer;
}
public boolean isCreated() { return isCreated; }
public void onBEventCreate(B event) {
System.out.println("Processing B event: " + event);
this.isCreated = true;
if (observer != null) observer.onEventCreated();
}
}使用示例:
public class Main {
public static void main(String[] args) {
AEvent aEvent = new AEvent();
BEvent bEvent = new BEvent();
// 构建监听器,自动完成注册
EventObserver observer = new EventObserver(aEvent, bEvent);
// 触发事件(顺序任意)
aEvent.onAEventCreate(new A()); // → 触发 observer.onEventCreated()
bEvent.onBEventCreate(new B()); // → 再次触发,满足双事件条件后执行 onBothEventsCreated()
}
}注意事项与进阶建议:
- ✅ 零侵入原则:AEvent/BEvent 的原有方法签名、参数、返回值完全保留,仅增加状态字段和观察者引用;
- ⚠️ 线程安全:若事件可能并发触发,需对 isCreated 标记及 onEventCreated() 调用加锁(如 synchronized 或 AtomicBoolean);
- ? 扩展性设计:可将 EventObserver 抽象为接口 EventListener,支持多监听器注册;或引入事件类型枚举,使单一监听器能区分处理不同事件;
- ? 避免循环依赖:确保 EventObserver 不直接调用 AEvent/BEvent 的业务方法,仅通过状态协调,维持单向依赖(事件类 → 观察者);
- ? 替代方案对比:若框架支持(如 Spring),可考虑 ApplicationEventPublisher + @EventListener 实现更优雅的声明式监听,但本方案纯 Java、无框架依赖,适用性更广。
该方案以极小的代码变更代价,实现了事件响应逻辑的集中化管理,完美契合“开闭原则”——对扩展开放(新增监听行为),对修改关闭(原类无需改动)。










