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

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

发布订阅模式在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. 小伙伴们在催更Spring系列,于是我写下了这篇注解汇总!!

    大家好,我是冰河~~ 由于在更新其他专题的文章,Spring系列文章有很长一段时间没有更新了,很多小伙伴都在公众号后台留言或者直接私信我微信催更Spring系列文章. 看来是要继续更新Spring文章 ...

  2. 6.11考试总结(NOIP模拟7)

    背景 时间分配与得分成反比,T1 20min 73pts,T2 1h 30pts,T3 2h 15pts(没有更新tot值,本来应该是40pts的,算是本次考试中最遗憾的地方了吧),改起来就是T3比较 ...

  3. VBS脚本编程(1)——数据类型、变量和常量

    数据类型 VBS只有一种数据类型,称为Variant.而该类型是可变的,以下是Variant的子类型: 子类型 描述 Empty 未初始化的Variant.对于数值变量,值为0:对于字符串变量,值为零 ...

  4. 解决SpringMVC重复提交的问题

    方法一:通过重定向采取请求转发的方式完成表单内容的添加会造成内容的重复插入.当向Servlet发送一条增加记录的请求后,servlet首先向数据库增加一条记录,然后又从数据库中查询出所有数据,接着转发 ...

  5. Go语言十六进制转十进制

    Go语言十六进制转十进制 代码Demo import ( "fmt" "strconv" "testing" ) func Test_1(t ...

  6. Golang修改操作系统时间

    Golang修改操作系统时间 需求 程序有时需要和服务器对时,发现延迟过高修改本地时间,这段代码网上抄的,实测可用,windows环境需要以管理员身份启动命令提示符调试 实现Demo package ...

  7. js笔记17

    BOM浏览器对象模型 1.window.open(url,ways) url 是打开的网页地址 ways 打开的方式  _self 2.window.close() 3.浏览器用户的信息 window ...

  8. 图解协程调度模型-GMP模型

    现在无论是客户端.服务端或web开发都会涉及到多线程的概念.那么大家也知道,线程是操作系统能够进行运算调度的最小单位,同一个进程中的多个线程都共享这个进程的全部系统资源. 线程 三个基本概念 内核线程 ...

  9. 通过修改Host实现chrome同步

    问题原因 : 中国的GW屏蔽了google服务,导致无法同步账号信息,这是一个很好的功能.可以同步书签,插件等! 跟chrome的版本号无关,设置hosts文件就能够正常运行(文件位置 : C:\Wi ...

  10. SDLC开发安全流程

    2020年12月9日跟内部小伙伴分享SDLC流程及安全的一些思考,简单画了一个图,时间过得太快,记录一下 参考 https://blog.csdn.net/liqiuman180688/article ...