You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求讲解发布-订阅设计模式的极简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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 00:10:46