概述
观察者模式定义了一个一对多的依赖关系,多个观察者监听一个目标对象。当目标对象的状态发生改变,会通知所有的观察者,进行更新操作。
观察者模式的两个要素是发布者和订阅者。
举个例子
你要去代购一双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('有货啦!');
控制台输出内容:
订阅者。