跳到主要内容

发布-订阅模式(Publish-Subscribe Pattern)

发布-订阅模式(Publish-Subscribe Pattern),也称为观察者模式(Observer Pattern),是一种行为型设计模式,用于建立对象之间的一对多关系,使一个对象(发布者)可以通知多个其他对象(订阅者)关于自身状态的变化,而不需要直接了解哪些对象正在订阅它。这种模式有助于实现松散耦合,使系统更具可扩展性和灵活性。

在发布-订阅模式中,有三个核心角色:

发布者(Publisher):也称为主题(Subject)或被观察者(Observable),负责维护订阅者列表,提供方法来添加、删除和通知订阅者。

订阅者(Subscriber):也称为观察者(Observer),订阅者注册到发布者以接收通知,并定义处理通知的方法。

事件或消息:发布者通知订阅者的方式,通常是通过事件或消息。

场景

事件处理:用于处理用户界面的事件,如按钮点击、鼠标移动等。

消息通信:在分布式系统中,不同组件之间的消息通信可以使用发布-订阅模式。

解耦组件:用于将一个组件解耦(解除依赖)与另一个组件,从而使系统更加灵活。

日志记录:在应用程序中,可使用发布-订阅模式将日志信息发布给多个日志记录器,从而实现多重日志记录。

实现

// 发布者
class Publisher {
constructor() {
this.subscribers = [];
}

subscribe(subscriber) {
this.subscribers.push(subscriber);
}

unsubscribe(subscriber) {
const index = this.subscribers.indexOf(subscriber);
if (index !== -1) {
this.subscribers.splice(index, 1);
}
}

notify(message) {
this.subscribers.forEach((subscriber) => subscriber.update(message));
}
}

// 订阅者
class Subscriber {
constructor(name) {
this.name = name;
}

update(message) {
console.log(`${this.name} received message: ${message}`);
}
}

// 客户端代码
const publisher = new Publisher();

const subscriber1 = new Subscriber("Subscriber 1");
const subscriber2 = new Subscriber("Subscriber 2");

publisher.subscribe(subscriber1);
publisher.subscribe(subscriber2);

publisher.notify("Hello, subscribers!");

publisher.unsubscribe(subscriber2);

publisher.notify("One subscriber unsubscribed.");

在上面的示例中,Publisher 是发布者,负责维护订阅者列表,提供 subscribe、unsubscribe 和 notify 方法。Subscriber 是订阅者,定义了 update 方法来处理收到的通知。

客户端代码创建了一个发布者和两个订阅者,并通过 subscribe 方法将订阅者注册到发布者。然后,发布者通过 notify 方法向所有订阅者发送消息。订阅者接收并处理消息。

发布-订阅模式有助于将对象解耦,提高系统的可维护性和灵活性,尤其在需要多个对象响应同一事件或消息时非常有用。