观察者模式与发布订阅模式的区别:发布订阅模式有个事件调度中心
// 定义一个被观察者
var observed = (function () {
var observers = []; // 存放所有观察者的列表
var id = 0; // 标记观察者
var _val = null;
return {
// 被观察的变量
get val() {
return _val;
},
set val(value) {
_val = value
this.notify();
return true;
},
// 添加观察者
addObserver: function (observer) {
if (observers.indexOf(observer) !== -1) return;
observers.id = id++;
observers.push(observer);
},
// 删除观察者
removeObserver: function (observer) {
observers = observers.filter(function (o) {
return o.id !== observer.id
});
},
// 通知所有的观察者
notify() {
observers.forEach(function (observer) {
observer.update(_val);
})
}
}
})();
// 定义一个观察者类
function Observer(fn) {
this.update = function (value) {
fn(value);
};
}
const observer1 = new Observer((a) => { console.log('o1', a) });
const observer2 = new Observer((a) => { console.log('o2', a) });
observed.addObserver(observer1);
observed.addObserver(observer2);
observed.val = 55; // 控制台打印出 o1 55 和 o2 55