通用事件监听器设计:基于观察者模式的无侵入式解耦方案

本文介绍如何在不修改现有 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、无框架依赖,适用性更广。

该方案以极小的代码变更代价,实现了事件响应逻辑的集中化管理,完美契合“开闭原则”——对扩展开放(新增监听行为),对修改关闭(原类无需改动)。