什么是订阅发布模式

订阅发布模式定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主题对象。这个主题对象在自身状态变化时,会通知所有订阅者对象,使它们能够自动更新自己的状态。

将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相应对象间的一致性,这样会给维护、扩展和重用都带来不便。当一个对象的改变需要同时改变其他对象,而且它不知道具体有多少对象需要改变时,就可以使用订阅发布模式了。

一个抽象模型有两个方面,其中一方面依赖于另一方面,这时订阅发布模式可以将这两者封装在独立的对象中,使它们各自独立地改变和复用。订阅发布模式所做的工作其实就是在解耦合。让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。

订阅发布针对前端的使用场景

记得redux是为什么而出现的吗?
就是针对复杂的数据状态的管理,当一个状态发生了变化,你可能要在多个地方更新这些变化,同时这些状态的变化,又会引起其他的状态的变化。
而订阅发布就是解决这样的问题存在的。

有时候,你想监听一种状态,当在某种情况下,触发它,然后做一些相应的事,有点儿类似我们的自定义事件。订阅发布,也是解决这一类问题的利器。

基本的实现

基本的原理是维护一个对象,每次对这个对象进行遍历和更新。

function PubSub() {this.handles = {eventName: {eventsList: [],isOne: false,}}
}
PubSub.prototype.subscribe = function (eventName, callback) {let EventsList = [];if (arguments.length < 2) {throw new TypeError('arguments error');}if (Reflect.has(this.handles, eventName)) {EventsList = this.handles[eventName].eventsList;} else {this.handles[eventName] = {eventsList: [callback],isOne: false,};}EventsList.push(callback);
}PubSub.prototype.notify = function (eventName, ...rest) {if (this.handles[eventName]) {let EventsList = this.handles[eventName].eventsList, i = 0, isOne = this.handles[eventName].isOne;if (EventsList) {for (; i < EventsList.length; i++) {EventsList[i].apply(this, rest)}}if (isOne) {this.unsubscribe(eventName)}}return this;
}const myPub = new PubSub();myPub.subscribe('event', function (data) {console.log('触发');console.log(data)
})
document.getElementById('btn').onclick = function () {myPub.notify('event', 123);
}

在npm上如何使用

我在npm发布了关于订阅发布的模块。基本使用如下所示。

import PubSub from 'wd-pub-sub';// 绑定一个事件名为event的自定义事件
PubSub.subscribe('event', function (data) {console.log('触发');console.log(data);
});// 触发事件名为event的自定义事件
PubSub.notify('event', 123);

基本的API如下:

subscribe(eventName, callback);
发布一个自定义的事件

unsubscribe(eventName, callback);
接触一个自定义的事件

subscribeOne(eventName, callback);
发布一个只触发一次的自定义事件

notify(eventName, callback);
触发已经发布的自定义事件

订阅发布(PubSub)模式的实现以及使用价值相关推荐

  1. libminimsgbus集成消息通讯库(多协议订阅发布)

    无中心订阅发布 使用组播方式寻址,发布时通过组播发布本地接收订阅的地址,通知各节点订阅. 各节点以一个节点标识区分(guid),节点启动后自动初始化网络接收(使用nng库). 点对点通信 程序集成了n ...

  2. Python redis的订阅发布机制(publish、pubsub)

    为什么用订阅发布机制?原因在于它的速度要比pop.push快很多. 先介绍一下redis的pub/sub功能: Pub/Sub功能(means Publish, Subscribe)即发布及订阅功能. ...

  3. Redis学习 - NoSQL简介、redis安装、redis基础知识、数据类型、持久化、订阅发布、主从复制、哨兵模式、缓存击穿和雪崩

    学习视频地址:https://www.bilibili.com/video/BV1S54y1R7SB 完结撒花,感谢狂神 文章目录 1. NoSQL 1.1 单机Mysql的演进 1.2 当今企业架构 ...

  4. Publisher/Subscriber 订阅-发布模式原理解析

    Publisher/Subscriber 订阅-发布模式原理解析 参考资料 What Is Pub/Sub? Publish/Subscribe Messaging Explained 什么是serv ...

  5. ZeroMQ的订阅发布(publish-subscribe)模式

    ZeroMQ的订阅发布模式是一种单向的数据发布,当客户端向服务端订阅消息之后,服务端便会将产生的消息源源不断的推送给订阅者,本文的示例代码来源于文献[1]示例代码的修改. 发布-订阅图示 发布者使用P ...

  6. Java设计模式-观察者模式(订阅发布模式)

    Java设计模式-观察者模式(订阅发布模式) 一起来看 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一起坚持吧!! ...

  7. RabbitMQ下的生产消费者模式与订阅发布模式

    所谓模式,就是在某种场景下,一类问题及其解决方案的总结归纳.生产消费者模式与订阅发布模式是使用消息中间件时常用的两种模式,用于功能解耦和分布式系统间的消息通信,以下面两种场景为例: 数据接入    假 ...

  8. 4 交换机-fanout(订阅发布模式)

    目录 订阅发布模式 1.交换器(Exchange) 1.1.创建交换器 1.2 .推送消息到交换器 2.临时队列 3.绑定(bingdings) 5.代码例子 5.1.生产者代码示例 5.2.消费者代 ...

  9. Redis实现消息队列和订阅发布模式

    转载:https://www.cnblogs.com/qlqwjy/p/9763754.html 在项目中用到了redis作为缓存,再学习了ActiveMq之后想着用redis实现简单的消息队列,下面 ...

最新文章

  1. MySQL常用简单小命令
  2. 文本编辑器中实现自动换行的功能
  3. C++STL- 函数对象
  4. 算法和编程面试题精选 TOP50!(附代码+解题思路+答案)
  5. centos7安装php8,centos8安装php7.4
  6. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 12丨游戏玩法分析 V【难度困难】
  7. kl散度度量分布_数据挖掘比赛技巧——确定数据同分布
  8. 【寻子】人脸识别与寻子的碰撞
  9. 气象接口的开发和使用
  10. nginx介绍(一) 简介篇
  11. 碰上这种 Wi-Fi,iPhone 秒崩!
  12. 如果你不懂备案,那我简单点跟你说
  13. 权限汇总 uses-permission
  14. 如何成功发布一个MSMQ的Windows服务
  15. 书评:学会提问——批判性思维指南
  16. wacom数位板怎么调压感_数位板没有压感怎么办?如何设置?
  17. 远程调试——谷歌浏览器微信开发者工具
  18. Mule ESB开发与学习
  19. candence的图纸大小设置_AutoCAD中怎样自己设置图纸大小?
  20. CHOPS 音乐驱动动画

热门文章

  1. 五、电脑来电自动开机方法设置
  2. Dubbo负载均衡、集群容错
  3. 手把手教你solidworks中的齿轮配合
  4. 技术人修炼之道阅读笔记(八)归纳法思维
  5. c 语言 函数 公开课教案6,小班语言公开课教案范文(精选6篇)
  6. IOS数据存储 之WCDB (一)
  7. 【VUE】微商城(一)----安装mint-ui,mui,sass
  8. 无线WiFi模组技术,ESP32-S3物联网应用,家居生活智能化发展
  9. jQuery验证框架 .
  10. UE4学习笔记----学习光源(一)