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

2023-11-17

观察者模式与发布订阅模式的区别:
1、观察者模式中只有观察者和被观察者,发布订阅模式中有发布者、订阅者、调度中心
2、观察者模式是被观察者发生变化时自己通知观察者,发布订阅模式是通过调度中心来进行分布订阅操作

vue2中响应式数据就是由Object.defineProperty()和观察者模式结合实现的,进行依赖收集时(会收集当前组件的watcher),属性发生变化就会通知相关依赖进行更新操作。
vue2中父子组件之间通信时使用的vm.$on()和vm.$emit()这就属于发布订阅模式,还有vue2中的事件总线$bus也是。

发布订阅模式

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')​​
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

观察者模式和发布订阅模式 的相关文章

  • 如何向上转型以限制对象属性

    在 JavaScript 中 如何从子类向上转换到超类以自动删除超类中不存在的对象属性 示例 假设有以下 2 个类 class ClassA constructor public a string public b string class
  • JW Player javaScript API 不工作

    我使用 jwplayer version 5 10 2295 和浏览器 chrome 25 My code jwplayer container setup file path width 300px height 100px autost
  • Angular 4 过滤器搜索自定义管道

    所以我试图构建一个自定义管道来在 ngFor 循环中执行多个值的搜索过滤器 我花了几个小时寻找一个好的工作示例 其中大多数都是基于以前的版本 并且似乎不起作用 所以我正在构建管道并使用控制台为我提供值 但是 我似乎无法显示输入文本 以下是我
  • 类型错误:类扩展值未定义不是函数或 null

    尝试创建这些实体时出现以下错误 TypeError Class extends value undefined is not a function or null 我假设这与循环依赖有关 但是在使用表继承和一对多关系时应该如何避免这种情况
  • 在 jQuery .live() 方法中模拟“焦点”和“模糊”

    Update 从 jQuery 1 4 开始 live 现在支持focusin and focusout events jQuery http www jquery com currently1 doesn t support blur o
  • 在随机位置启动 HTML5

    我有一个大约 2 小时长的音轨 我想在我的网站上使用它 我希望它在页面加载时在随机位置开始播放曲目 使用 HTML5 可以吗 我知道您可以使用 element currentTime 函数来获取当前位置 但是如何在完全下载之前获取曲目的总时
  • Mapbox GL 中的 MaxBounds 和自定义非对称填充

    我有一个 Mapbox GL JS 应用程序 在地图上显示一些小部件 为了确保地图上的任何内容都不会被它们隐藏 我使用以下命令添加了一些填充map setPadding 这是一个不对称的 在我的例子中左边比右边大 它按预期工作 例如fitB
  • 在 R 传单中添加不透明度滑块

    如何在 R leaflet 应用程序中添加滑块来控制特定图层的不透明度 对于这个应用程序 我不想使用闪亮 这里建议 在 R 传单应用程序中添加滑块 https stackoverflow com questions 37682619 add
  • 设置双指缩放时精确的滚动位置

    我正在创建一个地图应用程序 它将标记图像放置在画布上并滚动到它 我正在使用浏览器的捏缩放和滚动来放大 缩小地图 然而 我注意到有一些奇怪的行为 我想知道如何解决它 这有点难以解释 但我们开始吧 假设您处于网页的标准缩放级别 无法进一步缩小
  • 在javascript中访问函数内的实例变量?

    如何以最简单的方式访问函数内的实例变量 function MyObject Instance variables this handler Methods this enableHandler function var button doc
  • jQuery输入文件点击方法和IE上拒绝访问

    我尝试仅使用一个按钮作为输入文件 它在 Firefox Chrome Safari 中工作正常 但在 IE 中不行 提交表单时我总是收到 访问被拒绝 的消息 代码 input file click 有真正的解决方法吗 我在谷歌上浪费了大约2
  • JS 保留以零结尾的小数[重复]

    这个问题在这里已经有答案了 在JavaScript中 是否可以 锁定 十进制数 以保留以零结尾的 浮点数 例如 我有 2 个不同的数字 如下所示 伪代码 let a 1 0 let b 1 00 a b true should be fal
  • karma/jasmine 控制台更详细的测试结果

    我使用 Karma 和 Jasmine 进行 javascript 单元测试 假设我有一个失败的测试 如下所示 expect objectA toEqual expectedObjectA 当失败时 我看到控制台上转储了两个对象 并显示一条
  • 检索 css3 缩放元素的宽度/高度

    我正在与 offsetWidth 属性的奇怪之处 我认为 作斗争 这是场景 比方说 我有一个span标签 在我的js中 在某个时刻我执行css3转换 对于这个元素 例如 el set styles transform scale scale
  • JavaScript中如何确保输入的值是数字而不是字符串?

    我创建了这个函数 function num var x prompt please enter your first number var y prompt please enter your second number if isNaN
  • Web组件中嵌套槽的内容不可见

    我有一个 Web 组件 它应该接受任意元素来包装其内容 虽然我可以在 Chrome 开发工具中看到插槽已正确分配 但 DOM 中什么也没有出现 以前有人见过这个问题吗 定义 class ExampleParent extends HTMLE
  • 呃!尝试将包发布到 npm 时出现 403

    我正在尝试将包发布到 npm 您可以在此处查看存储库 https github com biowaffeln mdx state https github com biowaffeln mdx state 我登录到 npmnpm login
  • 如何动态调整jqgrid到当前窗口大小?

    如何动态调整jqgrid到当前窗口大小 基于javascript jQuery 最好的例子在这里 TinyMCE 去 http www tinymce com tryit full php http www tinymce com tryi
  • Jwt 签名和前端登录身份验证

    我有这个特殊的 jwt sign 函数 Backend const token jwt sign id user id process env TOKEN SECRET expiresIn 1m res header auth token
  • 以角度访问窗口 TemplateUrl 内的范围

    我的模式有一个 windowTemplateUrl 如下 div class modal fade div class modal dialog div class modal content square btn div div div

随机推荐

  • Linux 维护日志:今日系统宕机,问题记录

    查看日志 显示包含如下信息 Jul 21 10 55 10 EYKERP1 kernel sd 3 0 0 0 SCSI error return code 0x00010000 Jul 21 10 55 10 EYKERP1 kernel
  • Redis基础知识(三):缓存穿透、缓存击穿、缓存雪崩

    文章目录 一 缓存穿透 出现过程 解决方法 二 缓存击穿 出现过程 解决方法 三 缓存雪崩 出现过程 解决方法 我们在项目中大量使用Redis承接海量数据的冲击 但是使用过程中也会遇到一些特殊的情况 这个就是缓存击穿 缓存穿透 缓存雪崩 一
  • 全志H3-----制作刷机包(TF卡)

    开发环境 Ubuntu 14 04 LTS busybox 1 26 2 U boot kernel lichee 全志原厂提供的BSP 1 制作一个 256M 的空白映象文件 你可以制作得更小或更大 dd if dev zero of f
  • JWT 安全及案例实战

    文章目录 一 JWT json web token 安全 1 Cookie 放在浏览器 2 Session 放在服务器 3 Token 4 JWT json web token 4 1 头部 4 1 1 alg 4 1 2 typ 4 2
  • Vue源码分析(Render渲染函数)

    文章目录 Render函数 渲染DOM原理 虚拟DOM Vue整体机制 Render Function API 练习Render函数动态渲染标签 函数组件和状态组件 练习Render函数动态渲染组件 Render函数 渲染DOM原理 在前面
  • SGX应用开发入门

    SGX应用开发入门 SGX 及 SDK 应用开发环境简介及搭建 第1部分 SGX应用开发入门 开发第一个 SGX 应用 Hello World 第2部分 SGX应用开发入门 SGX应用开发进阶篇 第3部分 英特尔 Software Guar
  • 周鸿祎力荐|纽约客16000字重磅刊文:区块链是回归互联网本质的唯一希望

    奇虎360创始人周鸿祎曾在朋友圈表示 迄今我认为说的最深入浅出最明明白白的一篇文章 没有大道理 没有空洞的口号 没有吓唬人的概念 这才是学习区块链技术最需要的基础 来源 纽约客 杂志 本文首发于机器之能 编译 张震 Edison Rik 这
  • Qt5中使用C++调用Python

    最近想把C 和Python一起混合编程 故作此文记录整个过程中的 坑 首先打开QtCreator 新建一个QtConsoleApplication 建立好了之后 在你的配置文件下面添加包含目录和库目录 INCLUDEPATH I D Pro
  • cass道路设计教程_cass道路设计

    1 生成里程文件 工程应用 菜单 生成里程文件 由纵断面线生成 功能 由道路中桩线即纵断面线生成里程文件 操作过程 1 在图上画出的道路纵断面线 必须是复合线 2 点取 由纵断面线生成 命令下的 新建 3 提示 选择纵断面线 请选择 1 中
  • Linux-0.12内核sleep_on函数分析

    sleep on用于进程休眠 原型如下 void sleep on struct task struct p 当进程访问某个互斥资源时 如果资源被另外进程占用 当前进程就需要休眠 假设资源的结构如下 struct res struct ta
  • HD DVD技术概要

    中文译者 陆其明 徐成哲原文标题 HD DVD A technical introduction原文版权 DVD论坛 http www dvdforum org 原文链接 http www dvdforum org images Forum
  • 伸手党福利文,Python入门大全

    文章目录 一 自学时间安排 Day1 Day15 Python语言基础 Day16 Day20 Python语言进阶 Day31 Day35 Linux操作系统 Day35 Day40 数据库基础和进阶 Day41 Day55 实战Djan
  • 编写函数对字符串进行反向排列

    1 题目 编写一个函数 reverse string char string 递归实现 实现 将参数字符串中的字符反向排列 不是逆序打印 要求 不能使用C函数库中的字符串操作函数 比如 char arr abcdef 逆序之后数组的内容变成
  • Sqlite数据库增删改查

    1 应用部分 package com example language import androidx appcompat app AppCompatActivity import android content ContentValues
  • 超级全的停用词整理

    一切看似逝去的 都不曾离开 你所给与的爱与温暖 让我执着地守护着这里 尤而小屋 一个温馨的小屋 小屋主人 一手代码谋求生存 一手掌勺享受生活 欢迎你的光临 人民 末 末 啊 阿 哎 哎呀 哎哟 唉 俺 俺们 按 按照 吧 吧哒 把 罢了 被
  • Vim编辑器使用

    一 Vim 编辑器简介 vi 编辑器是 Linux 里最基本的文本编辑器 系统自动安装了 vi 而 vim 是 vi 的加强版 vi 不显示高亮颜色语法 vim 能显示高亮颜色语法 如果系统没有自动安装 vim 需自行下载安装 二 Vim
  • Python实现登录接口测试

    一 准备数据 1 获得测试路径 即URL 2 准备测试数据 获取方式 二 可以先使用postman测试 调通后再使用Python实现 三 编写Python
  • MATLAB绘图函数fplot详解

    MATLAB绘图函数fplot详解 一 fplot基本语法 fplot不同于plot 主要用来根据函数表达式和自变量所属区间来直接绘制函数曲线 不需要给出像plot需要给出的自变量和因变量的数组 因此当函数表达式已知的情况 使用fplot绘
  • 倚天服务器里怎么修改装备,倚天私服完整GM命令

    倚天私服完整GM命令 本文出处 网游动力作者 本站发布时间 2009 07 26阅读次数 save命令 save XXX 手动保存玩家数据 save all 手动保存当前地图所有玩家数据 a命令 a ymir 999 调整ymir等级为99
  • 观察者模式和发布订阅模式

    观察者模式与发布订阅模式的区别 1 观察者模式中只有观察者和被观察者 发布订阅模式中有发布者 订阅者 调度中心 2 观察者模式是被观察者发生变化时自己通知观察者 发布订阅模式是通过调度中心来进行分布订阅操作 vue2中响应式数据就是由Obj