13.发布订阅模式
发布订阅模式(Publish-Subscribe Pattern)的主要目的是通过事件中心解耦发布者和订阅者,让发布者不感知具体消费方
适合使用发布订阅模式的场景
- 模块间通信频繁,但不希望互相直接依赖
- 一个事件需要被多个模块消费
- 希望把同步调用改成松耦合的事件驱动
- 需要统一管理事件注册、取消和分发
类型定义
type Handler<T = unknown> = (payload: T) => void;事件中心实现
class EventBus {
private events = new Map<string, Set<Handler>>();
on<T>(event: string, handler: Handler<T>): void {
if (!this.events.has(event)) {
this.events.set(event, new Set());
}
this.events.get(event)!.add(handler as Handler);
}
off<T>(event: string, handler: Handler<T>): void {
this.events.get(event)?.delete(handler as Handler);
}
emit<T>(event: string, payload: T): void {
this.events.get(event)?.forEach((handler) => handler(payload));
}
}使用示例
const bus = new EventBus();
const onOrderPaid = (payload: { orderId: string }) => {
console.log("发送支付成功通知:", payload.orderId);
};
bus.on("order:paid", onOrderPaid);
bus.emit("order:paid", { orderId: "O-1001" });
bus.off("order:paid", onOrderPaid);