发布订阅模式(观察者模式)

发布订阅模式的定义:它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知

发布订阅模式在JS中最常见的就是DOM的事件绑定与触发:

//todo 注册点击事件
btn.addEventListener("click", function (event) {
console.log("点击事件触发了");
});
//todo 执行点击事件
btn.click();

这两句代码就是该模式的核心:注册了点击事件,在某个特定时刻(这里是按钮点击)执行注册的事件。

在vue的事件绑定里用到了

在vue里的事件注册也是用的该模式,这里是vue里绑定事件的模仿:

class VueEvent {
constructor() {
this.callbakcs = Object.create(null);
} on(type, cb) {
if (!(type in this.callbakcs)) {
this.callbakcs[type] = [];
}
this.callbakcs[type].push(cb);
return this;
} off(type, fn) {
if (!(type && fn)) {
this.callbakcs = Object.create(null);
} else if (type && !fn) {
delete this.callbakcs[type];
} else {
const thisTypeCBs = this.callbakcs[type];
for (const key in thisTypeCBs) {
if (fn == thisTypeCBs[key] || fn == thisTypeCBs[key].fn) {
thisTypeCBs.splice(key, 1);
}
}
}
return this;
} once(type, cb) {
const _this = this;
function innerOnce(...arg) {
cb(...arg);
_this.off(type, innerOnce);
}
innerOnce.fn = cb;
this.on(type, innerOnce);
return this;
} emit(type, ...arg) {
if (type in this.callbakcs) {
const runs = [...this.callbakcs[type]]; //! 深复制 下面的循环里有可能会删除数组元素
for (const cb of runs) {
cb(...arg);
}
}
}
}

就本质来看,该模式在JS里的实现仍然是依靠JS的动态语言特性:能随意随时在对象中添加属性,方法;函数也是对象能被传递的特点。

与策略模式例子里的区别

在策略模式中的最后个例子里我用了一个包装类来收集每个元素运用的策略方法,这里与发布订阅模式很像当仍然有根本上的区别:

  • 策略模式不提供策略的增删,而观察者模式则提供了监听的真假与移除;
  • 策略模式需要知道策略方法接收的参数只能通过查看策略类,而观察者模式的监听方法是用户自定义的;

其实就策略模式最基本的实现上是不需要一个收集策略的类的,从这方面看它和观察者模式的相似点就只有“都有一个保存函数的缓存,在某个时候会被执行”。

js里的发布订阅模式及vue里的事件订阅实现的更多相关文章

  1. js设计模式-发布/订阅模式

    一.前言 发布订阅模式,基于一个主题/事件通道,希望接收通知的对象(称为subscriber)通过自定义事件订阅主题,被激活事件的对象(称为publisher)通过发布主题事件的方式被通知. 就和用户 ...

  2. 浅谈vue响应式原理及发布订阅模式和观察者模式

    一.Vue响应式原理 首先要了解几个概念: 数据响应式:数据模型仅仅是普通的Javascript对象,而我们修改数据时,视图会进行更新,避免了繁琐的DOM操作,提高开发效率. 双向绑定:数据改变,视图 ...

  3. JS中什么是发布--订阅模式?

    转载文章部分内容: 发布订阅模式介绍 发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. ...

  4. Javascript中理解发布--订阅模式

    Javascript中理解发布--订阅模式 阅读目录 发布订阅模式介绍 如何实现发布--订阅模式? 发布---订阅模式的代码封装 如何取消订阅事件? 全局--发布订阅对象代码封装 理解模块间通信 回到 ...

  5. SpringBoot事件监听机制及观察者模式/发布订阅模式

    目录 本篇要点 什么是观察者模式? 发布订阅模式是什么? Spring事件监听机制概述 SpringBoot事件监听 定义注册事件 注解方式 @EventListener定义监听器 实现Applica ...

  6. Vue—非父子组件间的传值(Bus/发布订阅模式/观察者模式/总线)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. JS中的发布订阅模式

    一. 你是如何理解发布订阅模式的 JS中的设计模式: 单例模式:处理业务逻辑 构造原型模式:封装类库,组件,框架,插件等 类库:jQuery 只是提供了一些常用的方法,可以应用到任何的项目中,不具备业 ...

  8. js设计模式之发布/订阅模式模式

    一.前言 发布订阅模式,基于一个主题/事件通道,希望接收通知的对象(称为subscriber)通过自定义事件订阅主题,被激活事件的对象(称为publisher)通过发布主题事件的方式被通知. 就和用户 ...

  9. JS的发布订阅模式

    JS的发布订阅模式 这里要说明一下什么是发布-订阅模式 发布-订阅模式里面包含了三个模块,发布者,订阅者和处理中心.这里处理中心相当于报刊办事大厅.发布者相当与某个杂志负责人,他来中心这注册一个的杂志 ...

随机推荐

  1. 从简单示例看对象的创建过程, 为什么双重检查的单例模式,分析Volatile关键字不能少

    编译指令 :javac Test.java 反编译指令: javap -v Test 代码 public class ObjectTest { int m = 8; public static voi ...

  2. 一、部署监控服务器--安装LNMP环境

    1.要求: 本案例要求部署-台Zabbix监控服务器, -台被监控主机,为进一步执行具体的监控任务做准备:1.安装LNMP环境2.源码安装Zabbix3.安装监控端主机,修改基本配置4.初始化Zabb ...

  3. Ajax 和 JSON

    Ajax:异步更新页面的技术,必须在http或者https网络网络协议下使用             1.原生js实现:共4步             2.jQuery:$.ajax(配置对象);   ...

  4. csp-s模拟测试「9.14」A·B·C(三分,贪心)

    博客大概咕了很久了......... T1 A 大概推下式子就好了,考试时数据点分治DFS前30点T了,然后后70分因为两数相乘爆long long然后本来可以A掉,就WA零了....... 式子推出 ...

  5. NOIP模拟测试26「嚎叫响彻在贪婪的机房·主仆见证了 Hobo 的离别·征途堆积出友情的永恒」

    题目比较神仙,注意是题目神仙 贪婪暗示贪心,堆积暗示堆优化$\%\%\%\%\%\%\%$ 两个乱搞$+$一个堆优化$dp$ 嚎叫响彻在贪婪的机房 题解 对于一个序列来说只要他们差的$gcd$不为$1 ...

  6. Netty 框架学习 —— 编解码器框架

    编解码器 每个网络应用程序都必须定义如何解析在两个节点之间来回传输的原始字节,以及如何将其和目标应用程序的数据格式做相互转换.这种转换逻辑由编解码器处理,编解码器由编码器和解码器组成,它们每种都可以将 ...

  7. AI框架中图层IR的分析

    摘要:本文重点分析一下AI框架对IR有什么特殊的需求.业界有什么样的方案以及MindSpore的一些思考. 本文分享自华为云社区<MindSpore技术专栏 | AI框架中图层IR的分析> ...

  8. 深入学习Netty(3)——传统AIO编程

    前言 之前已经整理过了BIO.NIO两种I/O的相关博文,每一种I/O都有其特点,但相对开发而言,肯定是要又高效又简单的I/O编程才是真正需要的,在之前的NIO博文(深入学习Netty(2)--传统N ...

  9. 解决git同步每次都需要输入用户名、密码

    打开 git bash 执行命令: git config --global credential.helper store

  10. iOS工程师如何恍然大悟?

    聊聊行情?为什么总有人在乎旁人的看法而忽略自己的初衷? 虽然iOS开发市场说不上好但也绝不算坏,想没想过那些煽风点火说iOS不行的人在做什么? 真的转行从头开始? 错.大错特错! 在劝退你的同时他们会 ...