观察者模式和发布订阅模式

观察者模式与发布订阅模式的区别:

1、观察者模式中只有观察者和被观察者,发布订阅模式中有发布者、订阅者、调度中心

2、观察者模式是被观察者发生变化时自己通知观察者,发布订阅模式是通过调度中心来进行分布订阅操作

发布订阅模式

javascript 复制代码
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', () => {
	
})

观察者模式

javascript 复制代码
 ​​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')​​
相关推荐
子兮曰5 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰5 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万5 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝5 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋5 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁5 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄5 天前
JavaScript 隐式全局变量解析
javascript
汉堡大王95275 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大5 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师5 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端