「设计模式」观察者模式

334 阅读1分钟

概述

观察者模式定义了一个一对多的依赖关系,多个观察者监听一个目标对象。当目标对象的状态发生改变,会通知所有的观察者,进行更新操作。

观察者模式的两个要素是发布者订阅者

举个例子

你要去代购一双AJ,你需要在朋友圈里找到代购的卖家。他把你拉到一个微信群里,等到有货的时候,他会通知你去购买。
这就是一个观察者模式,卖家就是发布者,你就是观察者

代码来实现

首先我们来明确,只要是发布者就会有添加订阅者的功能(在上面是拉到微信群),还有通知订阅者去更新操作(通知你有货)。

// 定义发布者类
class Publisher {
  constructor() {
    // 订阅者数组
    this.observers = [];
  }
  // 添加订阅者
  add(observer) {
    this.observers.push(observer);
  }
  // 通知订阅者
  notify() {
    this.observers.forEach((observer) => {
      observer.update(this);
    });
  }
}

接下来我们来定义订阅者类,它只有一个被发布者调用的更新操作的方法。

// 定义者订阅者类
class Observer {
  constructor() {}
  update() {
    console.log('update observer');
  }
}

以后遇到的所有拓展的业务场景,都可以来自这两个类的extends。

// 卖家类
class Seller extends Publisher {
  constructor() {
    super();
    this.state = null;
  }
  // 更新状态
  setState(state) {
    this.state = state;
    // 通知所有卖家
    this.notify();
  }
}

// 定义买家类
class Buyer extends Observer {
  constructor(name) {
    super();
    this.name = name;
  }
  // 更新操作
  update(publisher) {
    if (publisher.state) {
      this.buy();
    }
  }
  // 具体的操作
  buy() {
    console.log(`${this.name} buy something`);
  }
}

接着,我们来实例化这两个类,来看看具体效果。

const seller = new Seller();
const buyer1 = new Buyer('买家1');
const buyer2 = new Buyer('买家2');

seller.add(buyer1);
seller.add(buyer2);

seller.setState('有货啦!');

控制台输出内容:

没有问题可以正常的通知订阅者