Rxjs_观察者模式和发布订阅模式
设计模式
捡起大学所学的《设计模式》吧 Orz
观察者模式和发布订阅模式特别容易被人们混淆,很多书里面也将这两个概念混为一谈,所以首先要搞清楚这两种模式的区别。
观察者模式
代码语言:javascript复制╭─────────────╮ Fire Event ╭──────────────╮
│ │─────────────>│ │
│ Subject │ │ Observer │
│ │<─────────────│ │
╰─────────────╯ Subscribe ╰──────────────╯
观察者其模式实很好理解,模式中只有两种角色,观察者和被观察者。
观察者模式属于行为型模式,用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应。
Subject(目标) 目标又称为主题,它是指被观察的对象。
Observer(观察者) 观察者将对观察目标的改变做出反应
代码例子:jQuery
代码语言:javascript复制 function refresh() {
$('div').empty().text('you are stupid.')
$('div').trigger('refresh')
}
...
$('div').on('refresh', () => {
$('span').empty().text('go to find it.')
})
发布-订阅模式
代码语言:javascript复制 ╭─────────────╮ ╭───────────────╮ Fire Event ╭──────────────╮
│ │ Publish Event │ │───────────────>│ │
│ Publisher │────────────────>│ Event Channel │ │ Subscriber │
│ │ │ │<───────────────│ │
╰─────────────╯ ╰───────────────╯ Subscribe ╰──────────────╯
发布订阅模式属于广义上的观察者模式
发布订阅模式与观察者模式非常接近,仅仅只是多了一个中间层用于管理消息(信息通道),可以看成是一种优化的观察者模式。
生活中有一个很好的例子——广播电台,人们会把频道调到他们最喜欢的节目。广播站不知道观众听得是什么或者他们正在听什么,只需要发布他们的节目就可以了。而观众也不知道广播站制作节目的过程,他们只要在他们最喜欢的节目运行的时候把台调到对应的频道或者告知朋友就行。
观察者模式和发布-订阅模式的比较
两者的比较如下图所示:
观察者模式
- 必须知道具体的 Subject,两者可以直接联系
- 紧耦合
- 大多数是同步的
- 在单个应用程序地址空间中实现
发布订阅模式
- 无直接依赖关系,通过消息代理
- 松耦合
- 大多数是异步的(使用消息队列)
- 交叉应用模式
参考链接《对象间的联动——观察者模式(二) - 设计模式之行为型模式 - 极客学院 Wiki》 《设计模式:发布/订阅模式解析 - 记录技术的点滴 - SegmentFault 思否》 《观察者模式和发布订阅模式有什么不同? - 知乎》