专栏首页一只想做全栈的猫【Rxjs】Rxjs_观察者模式和发布订阅模式

【Rxjs】Rxjs_观察者模式和发布订阅模式

Rxjs_观察者模式和发布订阅模式

设计模式

捡起大学所学的《设计模式》吧 Orz

观察者模式和发布订阅模式特别容易被人们混淆,很多书里面也将这两个概念混为一谈,所以首先要搞清楚这两种模式的区别。

观察者模式

╭─────────────╮  Fire Event  ╭──────────────╮
│             │─────────────>│              │
│   Subject   │              │   Observer   │
│             │<─────────────│              │
╰─────────────╯  Subscribe   ╰──────────────╯

观察者其模式实很好理解,模式中只有两种角色,观察者和被观察者。

观察者模式属于行为型模式,用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应。

Subject(目标) 目标又称为主题,它是指被观察的对象。

Observer(观察者) 观察者将对观察目标的改变做出反应

代码例子:jQuery

  function refresh() {
    $('div').empty().text('you are stupid.')
    $('div').trigger('refresh')
  }
  ...
  $('div').on('refresh', () => {
    $('span').empty().text('go to find it.')
  })

发布-订阅模式

 ╭─────────────╮                 ╭───────────────╮   Fire Event   ╭──────────────╮
 │             │  Publish Event  │               │───────────────>│              │
 │  Publisher  │────────────────>│ Event Channel │                │  Subscriber  │
 │             │                 │               │<───────────────│              │
 ╰─────────────╯                 ╰───────────────╯    Subscribe   ╰──────────────╯

发布订阅模式属于广义上的观察者模式

发布订阅模式与观察者模式非常接近,仅仅只是多了一个中间层用于管理消息(信息通道),可以看成是一种优化的观察者模式。

生活中有一个很好的例子——广播电台,人们会把频道调到他们最喜欢的节目。广播站不知道观众听得是什么或者他们正在听什么,只需要发布他们的节目就可以了。而观众也不知道广播站制作节目的过程,他们只要在他们最喜欢的节目运行的时候把台调到对应的频道或者告知朋友就行。

观察者模式和发布-订阅模式的比较

两者的比较如下图所示:

观察者模式

  • 必须知道具体的 Subject,两者可以直接联系
  • 紧耦合
  • 大多数是同步的
  • 在单个应用程序地址空间中实现

发布订阅模式

  • 无直接依赖关系,通过消息代理
  • 松耦合
  • 大多数是异步的(使用消息队列)
  • 交叉应用模式

参考链接《对象间的联动——观察者模式(二) - 设计模式之行为型模式 - 极客学院 Wiki》 《设计模式:发布/订阅模式解析 - 记录技术的点滴 - SegmentFault 思否》 《观察者模式和发布订阅模式有什么不同? - 知乎》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【Angular】Angula6中的组件通信

    CloudCat
  • 【Angular】Angular 与 AngularJs 之间的纠缠不清

    Marketing/Branding 部分其实只是单纯的设定,不需要逻辑,所以记住就好。

    CloudCat
  • 【Angular6+】事件绑定

    添加如下 onSelect() 方法,它会把模板中被点击的英雄赋值给组件的 selectedHero 属性。

    CloudCat
  • 设计模式遗珠(二)

    昨晚被杰伦的新歌刷屏了吧,当阿信出来的时候,我有点泪崩,我的青春呀,杰伦,五月天,满满的回忆,哈哈。之前转载过一篇关于五月天的故事,《一代人终将老去,五月天永远...

    程序员小跃
  • Gof设计模式之工厂模式(四)

    定义 工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 工厂模式...

    用户1257393
  • STM32远程乒乓升级,基于WIFI模块AT指令TCP透传方式,定时访问升级(含数据校验)

      定时使用http访问云端的程序版本,如果版本不一致,然后通过http下载最新的升级文件,实现升级.

    杨奉武
  • 执行start()的顺序不代表线程执行的顺序

    葆宁
  • 怎样开始制作一款微信小游戏?

    至于这个游戏是什么类型?竞技?休闲?益智?管它的,我连这个小游戏该叫什么名字都不知道。

    沙因Sign
  • 聊聊微信自动化的几种方案

    经常有小伙伴后台私信问我,自己每天大量的时间花在微信上,平常很多重复的操作都需要自己去亲力亲为,效率低的同时,人也累的半死,问我能否能做成自动化。

    叫我龙总
  • 稳扎稳打JS——“继承”

    JS使用原型链实现“继承” JS是“基于对象”的语言,因此没有继承。但可以使用JS的特性实现“继承”——原型链。 JS使用_proto_属性构造原型链,如 ...

    大闲人柴毛毛

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动