当前位置: 首页 > news >正文

观察者 ➜ 事件总线:一路走来的碎碎念

写给未来的自己:每次手敲事件模型都要 Google,干脆把思路和踩坑一次性记清楚。文章很长,都是唠叨,目的是让自己看两眼就能把设计理由找回来。


目录

  1. 为什么我要折腾事件模型?
  2. V0 ─ 单一事件的观察者模式
  3. V1 ─ 多事件同步总线(类型拆分)
  4. V2 ─ 订阅者优先级(链式调用可控)
  5. V3 ─ 事件优先级 + 异步(削峰 & 隔离)
  6. V4 ─ 组合式单线程总线(顺序极致保证)
  7. 经验小抄

1|为什么我要折腾事件模型?

  • 耦合度:把 if‑else 通知逻辑塞在同一个类里,一改就牵一大片,改怕了。
  • 可测试性:希望能单测“发一个事件 → 看谁收到了”,不用启动整套应用。
  • 面试尬聊:被问到“Spring ApplicationEvent 和 Observer 有啥区别”,含含糊糊很挫。

这篇就是把一次次“为什么要这样设计”写进代码注释里,别再年年忘。


2|V0 ‑ 单一事件的观察者模式

场景:只有一类消息,比如聊天窗口有人发言,监听者立刻打印出来。
痛点:一旦要支持第二种事件,就得复制粘贴另一套接口。

// ========== MessageEvent ==========
// 最简单的 POJO,只有一条内容。后面会发现 Event 越写越胖,这里先别管。
public class MessageEvent {private final String content;public MessageEvent(String content) { this.content = content; }public String content() { return content; }
}// ========== Listener ==========
// 单方法接口,本质就是 Java 版回调。
public interface Listener {void onMessage(MessageEvent e);
}public class ConsolePrinter implements Listener {@Override public void onMessage(MessageEvent e) {// 业务写死:收到就打印。只演示用。System.out.println("[Printer] " + e.content());}
}// ========== SimplePublisher ==========
// 最小发布者:仅负责遍历列表,没有任何顺序控制。
public class SimplePublisher {private final List<Listener> listeners = new ArrayList<>();public void addListener(Listener l) { listeners.add(l); }public void publish(String msg) {MessageEvent e = new MessageEvent(msg);// 顺序 = addListener 的顺序。这里没做保护性复制,线程安全靠调用方自觉。for (Listener l : listeners) l.onMessage(e);}
}

总结

  • 写起来爽,读起来爽,但一旦业务变复杂就原地报废。
  • 发布者对订阅者的 具体类型 没有依赖,但依赖了“只有一种事件”的假设。

3|V1 ‑ 多事件同步总线

目标:让 Publisher 不关心 到底是哪种事件,把“事件‑订阅者”关系外提。

3.1 核心接口

/** 所有事件的父类,加时间戳是为了调试时知道谁先谁后。 */

相关文章:

  • 贪心、动态规划、其它算法基本原理和步骤
  • 00.IDEA 插件推荐清单(2025)
  • fastdds:传输层SHM和DATA-SHARING的区别
  • java输出HelloWorld
  • C语言动规学习
  • HOOPS Exchange 与HOOPS Communicator集成:打造工业3D可视化新标杆!
  • 【SAP ME 44】在 HANA DB中报废SFC时的SHOP_ORDER表记录锁定
  • MyBatis框架
  • 图+文+语音一体化:多模态合成数据集构建的实战与方法论
  • 利用deepseek+Mermaid画流程图
  • C++类和对象上
  • 什么是单元测试的“覆盖率”
  • 《软件设计师》复习笔记(11.4)——处理流程设计、系统设计、人机界面设计
  • mysql collation_database 参数
  • Linux内核机制——内存管理
  • Git LFS 学习笔记:原理、配置、实践与心路历程
  • 【ROS】TEB 规划器
  • 概率多假设跟踪(PMHT):多目标跟踪中的概率软关联与高效跟踪算法解析
  • 继承的了解与学习
  • 使用 vcpkg 构建支持 HTTPS 的 libcurl 并解决常见链接错误
  • 湃书单|澎湃新闻编辑们在读的19本书:在工作中迷失
  • 新证据表明:地球水或为“自产”而非“外来”
  • 童书湃|世界读书日:在书里去辽阔的自然里撒个欢
  • 全国人大常委会启动工会法执法检查
  • 《哪吒2》票房已达157亿,光线传媒一季度净利增至20亿元
  • 广电总局加快布局超高清视听产业链,多项成果亮相