发布订阅

88 阅读1分钟

代码如下:

image.png

解读

发布者,负责把所有订阅者记录在册(subcribers存放的是所有订阅者)。

image.png

发布者,如同一个杂志社,要有让用户(订阅者)取消订阅的方法(将订阅者从记录在册的名单中去除)、通知订阅者的方法:我们杂志已经发给你了(调用订阅者收到通知的方法)。

image.png

// 发布者
// 这个类负责维护订阅者列表,提供订阅、取消订阅的方法,以及发布通知的方法
class Publisher {
  constructor() {
    this.subscribers = []; // 存放订阅者实例
  }

  // 订阅方法
  subscribe(subscriber) {
    this.subscribers.push(subscriber);
  }

  // 取消订阅方法
  unsubscribe(subscriber) {
    this.subscribers = this.subscribers.filter((sub) => sub !== subscriber);
  }

  // 发布方法
  publish(message) {
    this.subscribers.forEach((subscriber) => subscriber.notify(message));
  }
}

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

  // 接收通知并处理
  notify(message) {
    console.log(`${this.name} 收到通知:${message}`);
  }
}

// 使用示例
// 创建一个杂志社(新闻发布者)
const newsPublisher = new Publisher();
// 两个订阅者
const john = new Subscriber("John");
const jane = new Subscriber("Jane");

// 杂志社收录两个订阅者
newsPublisher.subscribe(john);
newsPublisher.subscribe(jane);

// 杂志社发布新闻杂志
newsPublisher.publish("新闻更新了!");

// 有一个用户取消订阅了
newsPublisher.unsubscribe(john);

// 杂志社发布新闻杂志
newsPublisher.publish("紧急新闻!!");