文章目录

  • 一、发布订阅模式是什么?
  • 二、发布订阅模式的优缺点
  • 三、实现一个通用的发布订阅模式

一、发布订阅模式是什么?

发布订阅模式是对象间的一种一对多的关系,由发布者、订阅者、消息管理器三部分组成,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知。

不论是在程序世界里还是现实生活中,发布—订阅模式的应用都非常广泛。我们先看一下现实中的例子
小明最近看上了一套房子,到了售楼处之后才被告知,该楼盘的房子早已售罄。好在售楼MM告诉小明,不久后还有一些尾盘推出。开发商正在办理相关手续,手续办好后便可以购买。但到底是什么时候,目前还没有人能够知道。
于是小明记下了售楼处的电话,以后每天都会打电话过去询问是不是已经到了购买时间。除了小明,还有小红,小强,小龙也会每天向售楼处咨询这个问题。一个星期过后,售楼MM决定辞职,因为厌倦了每天回答1000个相同的电话。
当然现实中没有这么笨的销售公司,实际上故事是这样的:小明离开之前,把电话号码留在售楼处。售楼MM答应他,新楼盘一推出就马上发信息通知小明。小红、小强、小龙也是一样,他们的电话号码都被记在售楼处的花名册上,新楼盘推出的时候,售楼MM会翻开花名册,遍历上面的电话号码,依次发送一条短信通知他们。

二、发布订阅模式的优缺点

优点:

  • 广泛应用于异步编程,它可以代替我们传统的回调函数,我们不需要关注对象在异步执行阶段的内部状态,我们只关心事件完成的时间点
  • 取代对象之间硬编码通知机制,一个对象不必显式调用另一个对象的接口,而是松耦合的联系在一起 。虽然不知道彼此的细节,但不影响相互通信。更重要的是,其中一个对象改变不会影响另一个对象

缺点:

  • 创建订阅者需要消耗一定的时间和内存
  • 虽然可以弱化对象之间的联系,但是如果过度使用的话,代码反而不太好理解和维护。特别是有多个发布者和订阅者的嵌套到一起的时候,要跟踪一个bug并不是一件轻松的事情

三、实现一个通用的发布订阅模式

// 定义事件中心类
class MyEvent {handlers = {} // 存放事件 map,发布者,存放订阅者
// 绑定事件$on(type, fn) {if (!Reflect.has(this.handlers, type)) { // 如果没有定义过该事件,初始化该订阅者列表this.handlers[type] = []}this.handlers[type].push(fn) // 存放订阅的消息}// 触发事件$emit(type, ...params) {if (!Reflect.has(this.handlers, type)) { // 如果没有该事件,抛出错误throw new Error(`未注册该事件${type}`)}this.handlers[type].forEach((fn) => { // 循环事件列表,执行每一个事件,相当于向订阅者发送消息fn(...params)})}
// 取消订阅$remove(type, fn) {if (!Reflect.has(this.handlers, type)) {throw new Error(`无效事件${type}`)}if (!fn) { // 如果没有传入方法,表示需要将该该类型的所有消息取消订阅return Reflect.deleteProperty(this.handlers, type)} else {const inx = this.handlers[type].findIndex((handler) => handler === fn)if (inx === -1) { // 如果该事件不在事件列表中,则抛出错误throw new Error('无效事件')}this.handlers[type].splice(inx, 1) // 从事件列表中删除该事件if (!this.handlers[type].length) { // 如果该类事件列表中没有事件了,则删除该类事件return Reflect.deleteProperty(this.handlers, type)}}}
}

实现一个简单的发布订阅模式相关推荐

  1. 实现一个完整的发布订阅模式

    实现一个完整的发布订阅模式 前言 发布-订阅模式是我们经常会接触的到的设计模式,它定义一个对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知.在 JavaScri ...

  2. 每日学习一个设计模式--观察者模式(发布-订阅模式)

    定义 观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.这种模式有时又称作发布-订阅模式.模型-视图模式,它 ...

  3. 【EventBus】发布-订阅模式 ( 使用代码实现发布-订阅模式 )

    文章目录 一.发布-订阅模式 二.代码实现发布-订阅模式 1.订阅者接口 2.订阅者实现类 3.发布者 4.调度中心 5.客户端 一.发布-订阅模式 发布订阅模式 : 发布者 Publisher : ...

  4. JavaScript设计模式之发布-订阅模式(观察者模式)-Part1

    <JavaScript设计模式与开发实践>读书笔记. 发布-订阅模式又叫观察者模式,它定义了对象之间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖它的对象都将得到通知. 例如 ...

  5. 从东京奥运会看js设计模式之发布订阅模式

    开篇废话:本篇文章介绍发布-订阅模式,想必很多人听说过有一种观察者模式,网上既有资料说这是两种不同的设计模式,也有说这是一种模式,我倾向于认同他们是同一种设计模式.不必过于纠结 开篇楔子:东京奥运会已 ...

  6. 发布订阅模式,在工作中它的能量超乎你的想象

    不同的语言-相同的模式 最近在看设计模式的知识,而且在工作当中,做一些打点需求的时候,正好直接利用了发布订阅模式去实现的,这让我对发布订阅这种设计模式更加的感兴趣了,于是借此机会也和大家说说这个好东东 ...

  7. JavaScript 发布-订阅模式

    发布-订阅模式,看似陌生,其实不然.工作中经常会用到,例如 Node.js EventEmitter 中的 on 和 emit 方法:Vue 中的 $on 和 $emit 方法.他们都使用了发布-订阅 ...

  8. JavaScript中发布/订阅模式的理解

    订阅发布模式的介绍 发布订阅模式,它定义了一种一对多的关系,可以使多个观察者对象对一个主题对象进行监听,当这个主题对象发生改变时,依赖的所有对象都会被通知到. 在生活中我们常常遇到这样一种情况,我们在 ...

  9. Javascript设计模式之发布-订阅模式

    简介 发布-订阅模式又叫做观察者模式,他定义了一种一对多的依赖关系,即当一个对象的状态发生改变的时候,所有依赖他的对象都会得到通知. 回忆曾经 作为一名前端开发人员,给DOM节点绑定事件可是再频繁不过 ...

最新文章

  1. java实现页面高效刷新_selenium高效应对Web页面元素刷新的实例讲解
  2. 虚拟机上SourceInsight访问Linux系统的代码
  3. word 语音识别的数据丢失
  4. 全网最细 | 21张图带你领略集合的线程不安全
  5. Eclipse 中maven插件坏死解决办法
  6. 今晚直播 | AAAI 2018论文解读:零资源机器翻译的最新进展
  7. bean 属性设置默认值_activiti7源码分析之引擎初始化与Bean注入
  8. .NET Core 3.0-preview3 发布
  9. android xml 解析
  10. 使用Netty编写一个简单的群聊系统
  11. Excel 数据批量生成SQL语句
  12. CSS 权威指南 读书笔记(三)
  13. npm下载require
  14. civa机器人是什么_Civa机器人
  15. 怎么查看计算机簇大小,分区格式与簇的大小讲解
  16. Infor CRM咨询服务市场市场报告-Infor CRM咨询服务销售额及预测
  17. html页面使用地图,前端PC端使用地图步骤(高德)
  18. 优惠券和让利哪种营销方式更好?
  19. pl/sql---存储过程
  20. 1005 继续(3n+1)猜想 (25 分)

热门文章

  1. NODE.JS手机短信验证码代码实例
  2. 运动蓝牙耳机什么好?运动蓝牙耳机之好评
  3. BW2400GA 介绍
  4. 静态HTML网页设计作品——火影忍者动漫(7页) 动漫HTML代码 学生漫画设计与制作期末作业下载 大学生动漫设计与制作成品下载 漫画作业代码下载
  5. ENode框架Conference案例分析系列之 - 订单处理减库存的设计
  6. 循环程序设计-实验一 BY KTL
  7. mysql表分区(partition)
  8. mysql groupadd_MySQL_linux mysql 安装与操作,复制代码 代码如下:groupadd mysql - phpStudy...
  9. 百家号自媒体过新手期要多久?
  10. sonarqube更新最新包含阿里p3c的pmd插件