前言

上一篇文章中,我们讲了如何利用Observer(观察者)模式实现多选框的全选, 本篇文章将带来Publish/SubScribe模式,并且利用该模式实现一个简易的消息通知功能,文章的最后还与Oberver进行对比。

什么是发布者/订阅模式?

Publish/Subscribe模式使用了一个主题/ 事件通道,这个通道介于希望接收到通知的对象(订阅者)和激活事件的对象之间(发布者)。

实现

class Pubsub {constructor() {this.topics = {};this.subUid = -1;}// 发布或者广播事件publish = function (topic, args) {if (!this.topics[topic]) {return false;}let subscribe = this.topics[topic];let len = subscribe ? subscribe.length : 0;while (len--) {subscribe[len].func(topic, args);}};// 通过特定的名称和回调函数订阅事件subscribe = function (topic, func) {if (!this.topics[topic]) {this.topics[topic] = [];}let token = (++this.subUid).toString();this.topics[topic].push({token,func,});return token;};// 基于订阅上的标记引用,通过特定的topic进行取消订阅unsubscribe = function (token) {for (let m in this.topics) {if (this.topics[m]) {for (let i = 0; i < this.topics[m].length; i++) {if (this.topics[m][i].token === token) {this.topics[m].splice(i, 1);return token;}}}}return this;};}

优点

  • Observer模式和Publish/Subscribe模式鼓励我们努力思考应用程序不同部分之间的关系,可以用于将应用程序分解更小、更松散耦合的块,以改进代码管理和潜在的复用。
  • 在使用任何一种模式时,动态关系可以在观察者和目标之间存在。提供了很大的灵活性,当应用程序的不同部分紧密耦合时,这不是很容易实现的。

缺点

  • 从订阅者中解耦发布者,它有时会很难保证应用程序的特定部分按照我们期望的运行。
  • 订阅者非常无视彼此的存在,并对变换发布者产生的成本视而不见。由于订阅者和发布者之间的动态关系,很难跟踪以来更新。

应用

利用Publish/Subscribe模式,实现一个简单的消息通知功能。

let pubsub = new Pubsub();//  简单的消息记录器所有通过订阅者接收到的主题和数据let messageLogger = function (topics, data) {console.log(topics, data);};// 订阅者监听订阅的topic,一旦topic进行广播,订阅者就调用回调函数let subscription = pubsub.subscribe('inbox/newMessage', messageLogger);// 发布者负责发布程序感兴趣的topic 或者通知pubsub.publish('inbox/newMessage', 'hello word');//pubsub.publish('inbox/newMessage', ['test', 'a', 'b', 'c']);// 这里取消订阅pubsub.unsubscribe(subscription);// 因为这里取消了订阅,所以后续没法通知到订阅者pubsub.publish('inbox/newMessage', {sender: 'hello@baidu.com',body: 'hey~',});

Observer(观察者)模式和Publish/SubScribe(发布/订阅)模式的区别

  • Observer模式要求希望接收到主题通知的观察者必须订阅内容改变的事件。

  • Publish/SubScribe模式允许任何订阅者执行适当的事件处理程序来注册和接收发布者发出的通知。

很多人认为,Observer模式和Publish/Subscribe模式是一样的,其实他们还是有很多不同的,他们两者的区别就跟之前是快递员上门送货,后来快递太多了,为了增加效率,分工更明确一点,现在多了个中间站,菜鸟驿站,快递员方便了,这是在规模起来以后自然而然的选择。现在是人主动去拿快递,如果以后连这也嫌弃效率不高,怎么办?再加一层,菜鸟驿站派出机器人送。

他们二者的区别可以参考本文章:https://zhuanlan.zhihu.com/p/51357583

Publish/SubScribe(发布/订阅)模式相关推荐

  1. RabbitMQ工作模式Publish/Subscribe发布订阅,test测试代码

    RabbitMQ有以下几种工作模式 : 1.Work queues  工作队列 2.Publish/Subscribe 发布订阅 3.Routing      路由 4.Topics        通 ...

  2. php订阅系统,php redis pub/sub(Publish/Subscribe,发布/订阅的信息系统)之基本使用

    一.场景介绍 最近的一个项目需要用到发布/订阅的信息系统,以做到最新实时消息的通知.经查找后发现了redis pub/sub(发布/订阅的信息系统)可以满足我的开发需求,而且学习成本和使用成本也比较低 ...

  3. RabbitMQ 之发布订阅模式

    publish/subscribe 发布订阅模式中,生产者不再直接与队列绑定,而是将数据发送至交换机Exchange 交换机Exchange用于将数据按某种规则送入与之绑定的队列,进而供消费者使用. ...

  4. 译: 3. RabbitMQ Spring AMQP 之 Publish/Subscribe 发布和订阅

    在第一篇教程中,我们展示了如何使用start.spring.io来利用Spring Initializr创建一个具有RabbitMQ starter dependency的项目来创建spring-am ...

  5. Redis的发布订阅模式

    本文源码参看:https://github.com/duktig666/learn-example/tree/5586febea31c2fb368e19fbdba11ed08afd463e0/Redi ...

  6. RabbitMQ发布/订阅模式(Publish/Subscribe)

    工作队列模式是直接在生产者与消费者里声明好一个队列,这种情况下消息只会对应同类型的消费者. 举个用户注册的列子:用户在注册完后一般都会发送消息通知用户注册成功(失败).如果在一个系统中,用户注册信息有 ...

  7. RabbitMQ指南之三:发布/订阅模式(Publish/Subscribe)

    在上一章中,我们创建了一个工作队列,工作队列模式的设想是每一条消息只会被转发给一个消费者.本章将会讲解完全不一样的场景: 我们会把一个消息转发给多个消费者,这种模式称之为发布-订阅模式. 为了阐述这个 ...

  8. Publish/Subscribe 发布与订阅模式

    Publish/Subscribe 发布与订阅: 通过交换机来实现,一个生产者可以让不同队列的消费者同时得到消息 生产者: package Fanout; import com.rabbitmq.cl ...

  9. Redis 笔记(10)— 发布订阅模式(发布订阅单个信道、订阅信道后的返回值分类、发布订阅多个信道)

    1. 发布-订阅概念 发布-订阅 模式包含两种角色,分别为发布者和订阅者. 订阅者可以订阅一个或者若干个频道(channel): 而发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都可以收到此消 ...

  10. Redis 高级特性(2)—— 发布 订阅模式

    Redis 高级特性 -- 发布订阅 1. 发布-订阅介绍 "发布-订阅"模式包含两种角色,分别为发布者和订阅者.订阅者可以订阅一个或者若干个频道(channel),而发布者可以向 ...

最新文章

  1. ubuntu较快台湾源
  2. Hadoop源代码分析(四)
  3. 按字段顺序加载或解析JSON对象
  4. 2017年山东省ACM省赛总结
  5. Linux 关闭桌面方法
  6. BlackHat Arsenal USA 2018 ToolsWatch黑客工具库
  7. VS2008系统开发背景图片的添加及注意事项
  8. cmd cd命令_常用的一些dos命令分享
  9. 几种常用HTML5移动应用框架的比较
  10. 帧数测试软件苹果,如何监视FPS(每秒帧数)在Mac OS X中进行石英调试 | MOS86
  11. 全球顶尖!StarVR推出搭载集成眼动追踪的VR设备
  12. 服务器ssl证书在哪查看,https证书查看
  13. 工作两年小结----勿忘初心不负梦想
  14. 两平面平行方向向量关系_方向向量和法向量的关系
  15. springboot-3-整合ehcache缓存
  16. python接受键盘输入_Python读取键盘输入的2种方法
  17. j-link V7.22b 提示“The connected J-Link is defective“
  18. 动态规划java实现数塔问题_动态规划入门_数塔问题
  19. python绘制动态图形_让Python绘制一套动态图形给你看看
  20. 几组数据的相关性python_几的解釋|几的意思|漢典“几”字的基本解釋

热门文章

  1. 一次性删除PPT所有动画
  2. 炫 音乐可视化 html5 在线,HTML5打造的炫酷本地音乐播放器-喵喵Player
  3. Permission denied(publickey) 解决办法
  4. 用jupyter notebook修改.md文件后,遇见的问题:Jupyter上无法保存md文件; FileNotFoundError: [Errno 2] No such file or direc
  5. 金山打字专业文章计算机,文字录入(排版完成)_计算机软件及应用_IT计算机_专业资料...
  6. 【转】一个交警肺腑之言:高速公路行车的安全注意事项
  7. 检查两个单词是否为变位词(Anagram)
  8. QQ、YY与webRTC回声消除效果对比分析与展望
  9. 实验一 熟悉常用的Linux操作和Hadoop操作
  10. 国家卫生计生委医院管理研究所简介