实现一个简单的发布订阅模式
文章目录
- 一、发布订阅模式是什么?
- 二、发布订阅模式的优缺点
- 三、实现一个通用的发布订阅模式
一、发布订阅模式是什么?
发布订阅模式是对象间的一种一对多的关系,由发布者、订阅者、消息管理器三部分组成,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知。
不论是在程序世界里还是现实生活中,发布—订阅模式的应用都非常广泛。我们先看一下现实中的例子:
小明最近看上了一套房子,到了售楼处之后才被告知,该楼盘的房子早已售罄。好在售楼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)}}}
}
实现一个简单的发布订阅模式相关推荐
- 实现一个完整的发布订阅模式
实现一个完整的发布订阅模式 前言 发布-订阅模式是我们经常会接触的到的设计模式,它定义一个对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知.在 JavaScri ...
- 每日学习一个设计模式--观察者模式(发布-订阅模式)
定义 观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.这种模式有时又称作发布-订阅模式.模型-视图模式,它 ...
- 【EventBus】发布-订阅模式 ( 使用代码实现发布-订阅模式 )
文章目录 一.发布-订阅模式 二.代码实现发布-订阅模式 1.订阅者接口 2.订阅者实现类 3.发布者 4.调度中心 5.客户端 一.发布-订阅模式 发布订阅模式 : 发布者 Publisher : ...
- JavaScript设计模式之发布-订阅模式(观察者模式)-Part1
<JavaScript设计模式与开发实践>读书笔记. 发布-订阅模式又叫观察者模式,它定义了对象之间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖它的对象都将得到通知. 例如 ...
- 从东京奥运会看js设计模式之发布订阅模式
开篇废话:本篇文章介绍发布-订阅模式,想必很多人听说过有一种观察者模式,网上既有资料说这是两种不同的设计模式,也有说这是一种模式,我倾向于认同他们是同一种设计模式.不必过于纠结 开篇楔子:东京奥运会已 ...
- 发布订阅模式,在工作中它的能量超乎你的想象
不同的语言-相同的模式 最近在看设计模式的知识,而且在工作当中,做一些打点需求的时候,正好直接利用了发布订阅模式去实现的,这让我对发布订阅这种设计模式更加的感兴趣了,于是借此机会也和大家说说这个好东东 ...
- JavaScript 发布-订阅模式
发布-订阅模式,看似陌生,其实不然.工作中经常会用到,例如 Node.js EventEmitter 中的 on 和 emit 方法:Vue 中的 $on 和 $emit 方法.他们都使用了发布-订阅 ...
- JavaScript中发布/订阅模式的理解
订阅发布模式的介绍 发布订阅模式,它定义了一种一对多的关系,可以使多个观察者对象对一个主题对象进行监听,当这个主题对象发生改变时,依赖的所有对象都会被通知到. 在生活中我们常常遇到这样一种情况,我们在 ...
- Javascript设计模式之发布-订阅模式
简介 发布-订阅模式又叫做观察者模式,他定义了一种一对多的依赖关系,即当一个对象的状态发生改变的时候,所有依赖他的对象都会得到通知. 回忆曾经 作为一名前端开发人员,给DOM节点绑定事件可是再频繁不过 ...
最新文章
- java实现页面高效刷新_selenium高效应对Web页面元素刷新的实例讲解
- 虚拟机上SourceInsight访问Linux系统的代码
- word 语音识别的数据丢失
- 全网最细 | 21张图带你领略集合的线程不安全
- Eclipse 中maven插件坏死解决办法
- 今晚直播 | AAAI 2018论文解读:零资源机器翻译的最新进展
- bean 属性设置默认值_activiti7源码分析之引擎初始化与Bean注入
- .NET Core 3.0-preview3 发布
- android xml 解析
- 使用Netty编写一个简单的群聊系统
- Excel 数据批量生成SQL语句
- CSS 权威指南 读书笔记(三)
- npm下载require
- civa机器人是什么_Civa机器人
- 怎么查看计算机簇大小,分区格式与簇的大小讲解
- Infor CRM咨询服务市场市场报告-Infor CRM咨询服务销售额及预测
- html页面使用地图,前端PC端使用地图步骤(高德)
- 优惠券和让利哪种营销方式更好?
- pl/sql---存储过程
- 1005 继续(3n+1)猜想 (25 分)
热门文章
- NODE.JS手机短信验证码代码实例
- 运动蓝牙耳机什么好?运动蓝牙耳机之好评
- BW2400GA 介绍
- 静态HTML网页设计作品——火影忍者动漫(7页) 动漫HTML代码 学生漫画设计与制作期末作业下载 大学生动漫设计与制作成品下载 漫画作业代码下载
- ENode框架Conference案例分析系列之 - 订单处理减库存的设计
- 循环程序设计-实验一 BY KTL
- mysql表分区(partition)
- mysql groupadd_MySQL_linux mysql 安装与操作,复制代码 代码如下:groupadd mysql - phpStudy...
- 百家号自媒体过新手期要多久?
- sonarqube更新最新包含阿里p3c的pmd插件