讲师中心 微信公众号
AI工具推荐 视频效率加速

通用事件监听器的设计与实现:基于观察者模式的解耦方案

云辰君_6027

云辰君_6027

发布时间:2026-01-06 21:29:02

|

832人浏览过

|

来源于php中文网

原创

通用事件监听器的设计与实现:基于观察者模式的解耦方案

本文介绍如何在不修改现有 aevent 和 bevent 类的前提下,通过观察者模式统一处理不同事件的创建逻辑,实现类型无关的事件响应机制。

在实际开发中,我们常遇到需要对多种相似但类型不同的事件(如 AEvent、BEvent)执行统一后续操作的场景。然而,受限于已有代码约束——不能修改 AEvent 和 BEvent 的原始定义——直接抽象共用接口或泛型基类不可行。此时,观察者模式(Observer Pattern)提供了一种优雅的解耦方案:它允许我们将“事件发生”与“响应行为”分离,并通过中间协调者(即观察者)聚合异构事件的状态与行为。

✅ 核心思路:引入中介观察者

我们不改变 AEvent 和 BEvent 的类结构,而是为它们添加轻量级扩展能力——即支持注册外部观察者,并在关键方法(如 onAEventCreate / onBEventCreate)中主动通知观察者。这符合开闭原则(对扩展开放,对修改关闭)。

Auth0 React
Auth0 React

已弃用 — 请改用 `auth0` 技能(运行 `npx clawhub install auth0`)。适用于为 React 单页应用(SPA)添加 Auth0 登录、登出、受保护路由或用户会话功能。该技能集成 `@auth0/auth0-react` — 即使用户仅表述为“为我的 React 应用添加登录功能”或“保护我的 React 路由”,而未明确提及 Auth0,也应使用此技能。

下载

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/BEvent 提供 setObserver 方法)
        aEvent.setObserver(this);
        bEvent.setObserver(this);
    }

    // 被 AEvent 调用
    public void onAEventCreated() {
        this.aCreated = true;
        checkAndTrigger();
    }

    // 被 BEvent 调用
    public void onBEventCreated() {
        this.bCreated = true;
        checkAndTrigger();
    }

    private void checkAndTrigger() {
        if (aCreated && bCreated) {
            onBothEventsCreated();
        }
    }

    // 统一业务入口:所有共性逻辑放在这里
    protected void onBothEventsCreated() {
        System.out.println("✅ Both AEvent and BEvent have been created.");
        // 此处可执行日志、通知、状态更新等通用操作
    }
}

2. 对现有类做最小侵入式增强(仅需添加 observer 支持)

⚠️ 注意:此步骤是必要适配,但不改变原有方法签名与核心逻辑,仅增加观察者回调能力。
class AEvent {
    private EventObserver observer;

    public void setObserver(EventObserver observer) {
        this.observer = observer;
    }

    public void onAEventCreate(A event) {
        // 原有业务逻辑保持不变
        System.out.println("Handling A event: " + event);

        // 新增:通知观察者
        if (observer != null) {
            observer.onAEventCreated();
        }
    }
}

class BEvent {
    private EventObserver observer;

    public void setObserver(EventObserver observer) {
        this.observer = observer;
    }

    public void onBEventCreate(B event) {
        // 原有业务逻辑保持不变
        System.out.println("Handling B event: " + event);

        // 新增:通知观察者
        if (observer != null) {
            observer.onBEventCreated();
        }
    }
}

3. 使用示例

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.onAEventCreated()
        bEvent.onBEventCreate(new B()); // → 触发 observer.onBEventCreated()
        // 当二者均触发后,自动执行 onBothEventsCreated()
    }
}

? 关键优势与注意事项

  • 零侵入原有逻辑:onAEventCreate() 和 onBEventCreate() 内部实现完全保留,仅追加一行通知调用;
  • 松耦合 & 可扩展:未来新增 CEvent,只需为其添加 setObserver() 和通知逻辑,再扩展 EventObserver 即可;
  • ⚠️ 线程安全提示:若事件可能并发触发,aCreated/bCreated 标志位应使用 AtomicBoolean 或加锁保护;
  • ⚠️ 生命周期管理:建议在 EventObserver 中提供 detach() 方法,避免内存泄漏(尤其在长生命周期对象中持有短生命周期事件引用时);
  • ? 进阶方向:可结合 Java 的 java.util.Observer(已过时)或现代替代方案如 PropertyChangeListener、Reactive Streams(如 Project Reactor),或使用 Spring Event 机制实现更强大的事件总线能力。

通过上述设计,你无需泛型、反射或动态代理,即可用清晰、可控、符合设计原则的方式,将异构事件纳入统一响应管道——这正是观察者模式在真实工程中的典型价值体现。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2131

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

397

2026.01.26

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3028

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

4249

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3649

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

366

2026.01.19

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

311

2026.03.13

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

3478

2023.08.10

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

20

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 11.9万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn