登录
首页 >  文章 >  java教程

观察者模式实现事件统一处理方法

时间:2026-01-14 15:34:11 473浏览 收藏

珍惜时间,勤奋学习!今天给大家带来《观察者模式实现事件统一处理方法》,正文内容主要涉及到等等,如果你正在学习文章,或者是对文章有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学习的大家!

通用事件监听器的设计:基于观察者模式实现跨类型事件统一处理

本文介绍如何在不修改现有 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 更具可维护性,是解耦异构事件处理的经典实践。

本篇关于《观察者模式实现事件统一处理方法》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于文章的相关知识,请关注golang学习网公众号!

前往漫画官网入口并下载 ➜
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>