观察者模式涉及3个对象,发布者、观察者、主题对象。它们是一(发布者)(主体对象)对多(观察者)的关系。
它的作用是,不需要总是事实访问数据,而是将主题数据提交给一个数据管理中心(发布者),然后将订阅者统一管理。当我在任何时候需要需要通知订阅者时,可以统一地、一次性地将数据发送给所有订阅者。
它解决的实际问题,就是将业务重心转移,不需要繁琐地、实时地访问数据,而只需要关心数据产生变化(通常是这样)时负责的业务。
// 观察者模式构造器
class Publisher {
// 订阅者的 map
dep = new Map();
// 数据主体,被观察的数据
data = null;
constructor(data){
this.data = data;
}
// 订阅
subscribe(fn){
this.dep.set(fn, fn);
}
// 取消订阅
unsubscribe(fn){
this.dep.delete(fn);
}
// 发布————实际上,当有任何数据变化的时候,才应该执行发布
publish(){
this.dep.forEach(fn => {
fn(this.data);
});
}
}
// 发布者,观察的数据是123
const publisher = new Publisher(123);
// 订阅者1
const watcherFn1 = function (observerData){
// watcherFn1,被观察的对象
console.log(arguments.callee.name, observerData);
};
// 订阅者2
const watcherFn2 = function (observerData){
// watcherFn2,被观察的对象
console.log(arguments.callee.name, observerData);
};
// 2个订阅者订阅了publisher
publisher.subscribe(watcherFn1);
publisher.subscribe(watcherFn2);
// 将会触发2个订阅者的回调函数
publisher.publish();
publisher.publish();
// fn2取消订阅
publisher.unsubscribe(watcherFn2);
// 只剩下fn1订阅有效
publisher.publish();