观察者模式与发布订阅模式的区别:
1、观察者模式中只有观察者和被观察者,发布订阅模式中有发布者、订阅者、调度中心
2、观察者模式是被观察者发生变化时自己通知观察者,发布订阅模式是通过调度中心来进行分布订阅操作
发布订阅模式
class EventBus {constructor() {this.events = {}; // 存储事件及其对应的回调函数列表}// 订阅事件subscribe(eventName, callback) {this.events[eventName] = this.events[eventName] || []; // 如果事件不存在,创建一个空的回调函数列表this.events[eventName].push(callback); // 将回调函数添加到事件的回调函数列表中}// 发布事件publish(eventName, data) {if (this.events[eventName]) {this.events[eventName].forEach(callback => {callback(data); // 执行回调函数,并传递数据作为参数});}}// 取消订阅事件unsubscribe(eventName, callback) {if (this.events[eventName]) {this.events[eventName] = this.events[eventName].filter(cb => cb !== callback); // 过滤掉要取消的回调函数}}
}
const eventBus = new EventBus()
eventBus.subscribe('add', () => {})
观察者模式
class Dom { constructor() {
// 订阅事件的观察者
this.events = {}}/** * 添加事件的观察者
* @param {String} event 订阅的事件 * @param {Function} callback 回调函数(观察者) */ addEventListener(event, callback) { if (!this.events[event]) {this.events[event] = []
} this.events[event].push(callback)} removeEventListener(event, callback) {if (!this.events[event]) {return
} const callbackList = this.events[event]const index = callbackList.indexOf(callback) if (index > -1) { callbackList.splice(index, 1) }} /**
* 触发事件 * @param {String} event */ fireEvent(event) { if (!this.events[event]) {
return
} this.events[event].forEach(callback => { callback()})
}}const handler = () => { console.log('fire click')}const dom = new Dom()dom.addEventListener('click', handler)
dom.addEventListener('move', function() {console.log('fire click2')})
dom.fireEvent('click')