Open ForeveHG opened 4 years ago
观察者模式和发布订阅模式最大的区别就是调度的方式不同,观察者模式是由目标直接调度,发布订阅模式由调度中心调度,用最简单的代码写一下大概是下面这样:
纯享版观察者模式
var Subject = { observers: [], //观察者列表 add(callback) { //添加观察者 this.observers.push(callback) }, remove() {}, //移除观察者 notify() { //通知所有观察者 this.observers.forEach(fn => fn()) } }
纯享版发布订阅模式
var Event = { _listeners: {}, //订阅通道 on: function (eventName, callback) { if (!this._listeners[eventName]) this._listeners[eventName] = []; this._listeners[eventName].push(callback) }, emit: function (eventName) { if (this._listeners[eventName]) { this._listeners[eventName].forEach(callback => { callback(...[].slice.call(arguments, 1)) }) } } };
//测试 Event.on('test', function (result) { console.log(result); }); Event.on('test', function () { console.log('test'); }); Event.emit('test', 'hello world'); // 输出 'hello world' 和 'test'
从上面两个纯享版代码可以看出来,观察者模式就是维护一个观察者列表,当需要时,直接广播通知(遍历整个观察者列表);发布订阅模式是维护一个订阅通道,所谓订阅通道就是一个按名称存储订阅者的地方,当某个事件名称被触发时,会在订阅通道中查找对应的订阅者列表,所以说白了发布订阅模式就是若干个观察者模式的集合。
观察者模式和发布订阅模式最大的区别就是调度的方式不同,观察者模式是由目标直接调度,发布订阅模式由调度中心调度,用最简单的代码写一下大概是下面这样:
纯享版观察者模式
纯享版发布订阅模式
//测试 Event.on('test', function (result) { console.log(result); }); Event.on('test', function () { console.log('test'); }); Event.emit('test', 'hello world'); // 输出 'hello world' 和 'test'