请求讲解发布-订阅设计模式的极简OOP核心类及接口
发布-订阅设计模式:极简抽象OOP实现
核心组件与必要接口(严谨OOP标准)
以下是实现发布-订阅模式所需的最精简抽象组件,每个组件职责单一,符合面向对象设计原则:
1. Event(事件载体)
- 职责:封装事件的类别标识与携带数据,是发布者与订阅者之间的信息传递单元
- 必要属性:
topic: string:唯一标识事件所属的主题(如"user.created")data?: unknown:可选的事件附加数据
2. Subscriber(订阅者)
- 职责:接收并处理指定主题的事件
- 必要接口:
handleEvent(event: Event): void:必须实现的事件处理方法,定义订阅者对事件的响应逻辑
3. Broker(消息代理)
- 职责:维护主题与订阅者的映射关系,负责将发布的事件转发给对应订阅者(解耦发布者与订阅者)
- 必要接口:
subscribe(topic: string, subscriber: Subscriber): void:为指定主题添加订阅者unsubscribe(topic: string, subscriber: Subscriber): void:移除指定主题的订阅者dispatch(event: Event): void:将事件转发给对应主题的所有订阅者
4. Publisher(发布者)
- 职责:生成事件并委托Broker进行分发
- 必要接口:
- 依赖注入
Broker实例(构造函数或Setter方法) publish(event: Event): void:将事件提交给Broker进行转发
- 依赖注入
极简TypeScript实现示例
// 抽象事件类:标准化事件结构 class Event { constructor(public readonly topic: string, public readonly data?: unknown) {} } // 订阅者抽象类:定义事件处理契约 abstract class Subscriber { abstract handleEvent(event: Event): void; } // 消息代理:核心调度中心 class Broker { private subscriptions: Map<string, Set<Subscriber>> = new Map(); subscribe(topic: string, subscriber: Subscriber): void { if (!this.subscriptions.has(topic)) { this.subscriptions.set(topic, new Set()); } this.subscriptions.get(topic)!.add(subscriber); } unsubscribe(topic: string, subscriber: Subscriber): void { const subscribers = this.subscriptions.get(topic); subscribers?.delete(subscriber); if (subscribers?.size === 0) { this.subscriptions.delete(topic); } } dispatch(event: Event): void { this.subscriptions.get(event.topic)?.forEach(sub => sub.handleEvent(event)); } } // 发布者类:事件生成与提交 class Publisher { constructor(private readonly broker: Broker) {} publish(event: Event): void { this.broker.dispatch(event); } }
关键说明
- 所有组件均为抽象通用实现,不包含任何领域特定逻辑,可直接扩展到任意业务场景
- 严格遵循OOP原则:订阅者通过抽象类定义契约,Broker解耦发布者与订阅者的直接依赖,每个类职责单一
- 若需简化,可省略
Event类直接用主题字符串传递,但Event能更严谨地封装事件上下文,推荐保留
内容的提问来源于stack exchange,提问作者Michael Moreno
相关产品推荐
相关产品推荐

