javascript中的发布订阅模式与观察者模式
这里了解一下JavaScript中的发布订阅模式和观察者模式,观察者模式是24种基础设计模式之一。
设计模式的背景
设计模式并非是软件开发的专业术语,实际上设计模式最早诞生于建筑学。
设计模式的定义是,在面向对象软件设计过程中,针对特定问题的简洁而优雅的解决方案。通俗一点说,设计模式是在某种场合下对某个问题的一种解决方案。再通俗一点说,设计模式就是给面向对象软件开发中的一些好的设计取名字。
这些好的设计模式并不是谁发明的,而是早已存在于软件开发中。一个稍有经验的程序员也许在不知不觉中数次使用过这些设计模式。GoF(Gang of Four,四人组)最大的功绩是把这些好的设计从浩瀚的面向对象世界中挑选出来,并且给予它们一个好听又好记的名字。
设计模式并不直接用来完成代码的编写,而是描述在各种不同的情况下,要怎么解决问题的一种方案。设计模式不是一个约束的机制,而是一种指导思想,一种写代码的形式。每种语言对于各种设计模式都有自己的实现方式,对于某些设计模式来说,可能在某些语言下并不适用,比如工厂方法模式对于JavaScript,因此设计模式应该被用在正确的地方。而哪些才算是正确的地方,只有在深刻地理解了设计模式的意图之后,再结合项目的实际场景才会知道。
设计模式的社区一直在发展。GoF在1995年提出了23种设计模式,但实际上设计模式并不仅仅局限于这23中,后面增加到了24种。在这20多年的时间里,也许有更多的设计模式已经被人发现并总结出来,比如一些JavaScript的书籍中会提到模块化模式、沙箱模式等。只是这些设计模式能否被世人公认并流传下来还有待时间验证。
观察者模式(Observer Pattern)
观察者模式定义了对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新。观察者模式属于行为型模式,行为型模式关注的是对象之间的通讯,观察者模式就是观察者和被观察者之间的通讯。
观察者模式有一个别名叫做发布-订阅模式,或者说叫订阅-发布模式,订阅者和订阅目标是联系在一起的,当订阅目标发生改变的时候,逐个通知订阅者。这里可以用报纸期刊的订阅来形象地说明,当你订阅了一份报纸,那么每天都会有一份最新的报纸送到你的手上。有多少人订阅报纸,报社就会发多少份报纸,报纸和订报纸的客户就是一对多的依赖关系。
发布订阅模式(Pub-Sub Pattern)
其实24种基本设计模式种并没有发布订阅模式,它只是观察者模式的一个别称。但是经过时间的沉淀,它似乎已经变得强大起来,已经独立于观察者模式,成为另外一种不同的设计模式。
在现在的发布订阅模式中,成为发布者的消息发送者不会将消息直接发送给订阅者,这就意味着发布者和订阅者不知道彼此的存在。在发布者和订阅者之间存在第三个组件,成为消息代理或调度中心或中间件,它维持着发布者和订阅者之间的联系,过滤所有发布者传入的消息并相应地分发它们给订阅者。
举一个例子,你在微博上关注了A,同时其他很多人也关注了A,那么当A发布动态的时候,微博就会为你们推送这条动态。在这里,A就是发布者,你则是订阅者,微博就是调度中心,你和A之间是没有直接的消息往来的,消息的推送全是通过微博来协调的。
观察者模式和发布订阅模式的区别
上面说到了发布订阅模式原来是观察者模式的一个别称,但是现在发布订阅模式渐渐地变成了独立于观察者模式的存在,也就是说两者之间存在了区别。
观察者模式是观察者(Observer)直接订阅(Subscribe)主题(Subject),当主题被激活的时候,会触发(Fire Event)观察者里的事件。
发布订阅模式则是订阅者(Subscriber)把自己想订阅的事件注册(Subscribe)到订阅中心(Topic),当发布者(Publisher)发布该事件(Publish Topic)到调度中心,也就是该事件被触发的时候,由调度中心统一调度(Fire Event)订阅者注册到调度中心的处理代码。
从这里可以看出,观察者模式模式和发布订阅模式最大的区别就是发布订阅模式有一个事件调度中心。观察者模式是由具体的目标调度,每个被订阅的目标里面都需要有对观察者的处理,这种处理方式比较直接粗暴,但是会造成代码的冗余。而发布订阅模式统一由调度中心进行处理,订阅者和发布者互补干扰,消除了发布者和订阅者之间的依赖。这样不仅实现了解耦,还有就是可以实现更细粒度的一些控制。比如发布者发布了很多消息,但是不想所有的订阅者都接收到,就可以在调度中心做一些处理,类似于权限控制制类的,还可以做一些节流的操作。
发布订阅模式是不是观察者模式的争论
关于这个问题的回答出现了两级分化的情况。有的人认为发布订阅者模式就是观察者模式,也有的人认为观察者模式与发布订阅模式很不一样。
如果以结构来分辨设计模式的话,发布订阅模式比观察者模式多了一个中间件订阅器,所以发布订阅模式是不同于观察者模式的;如果以意图来分辨模式,它们都是实现了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新,这时候就可以将它们看作是同一种模式,发布订阅模式只是在观察者模式的基础上做了升级优化。
实际上,不管它们是不是同一种设计模式,它们的实现方式的确存在差别,在使用的时候应该要根据实际的场景去判断、选择使用观察者模式还是发布订阅模式。
"有些人注定是等待别人的,有些人注定是被别人等的。"
javascript中的发布订阅模式与观察者模式的更多相关文章
- Javascript中理解发布--订阅模式
Javascript中理解发布--订阅模式 阅读目录 发布订阅模式介绍 如何实现发布--订阅模式? 发布---订阅模式的代码封装 如何取消订阅事件? 全局--发布订阅对象代码封装 理解模块间通信 回到 ...
- 【转】Javascript中理解发布--订阅模式
Javascript中理解发布--订阅模式 阅读目录 发布订阅模式介绍 发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时 ...
- [转] Javascript中理解发布--订阅模式
发布订阅模式介绍 发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 现实生活中的发布- ...
- [转] JavaScript设计模式之发布-订阅模式(观察者模式)-Part1
<JavaScript设计模式与开发实践>读书笔记. 发布-订阅模式又叫观察者模式,它定义了对象之间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖它的对象都将得到通知. 例如 ...
- 浅谈vue响应式原理及发布订阅模式和观察者模式
一.Vue响应式原理 首先要了解几个概念: 数据响应式:数据模型仅仅是普通的Javascript对象,而我们修改数据时,视图会进行更新,避免了繁琐的DOM操作,提高开发效率. 双向绑定:数据改变,视图 ...
- JavaScript设计模式(发布订阅模式)
发布—订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知.在JavaScript开发中,我们一般用事件模型来替代传统的发布—订阅模式 ...
- Javascript设计模式之发布-订阅模式
简介 发布-订阅模式又叫做观察者模式,他定义了一种一对多的依赖关系,即当一个对象的状态发生改变的时候,所有依赖他的对象都会得到通知. 回忆曾经 作为一名前端开发人员,给DOM节点绑定事件可是再频繁不过 ...
- javaScript设计模式:发布订阅模式
发布订阅模式的思想是在观察者模式的基础上演变而来,在观察者模式中客户端监听到对象某个行为就触发对应任务程序.而在发布订阅模式中依然基于这个核心思想,所以有时候也会将两者认为是同一种设计模式.它们的不同 ...
- JavaScript设计模式_05_发布订阅模式
发布-订阅模式,定义了对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都将得到通知.发布-订阅模式是使用比较广泛的一种模式,尤其是在异步编程中. /* * pre:发布-订阅 ...
随机推荐
- Java 类加载机制(阿里)-何时初始化类
(1)阿里的面试官问了两个问题,可以不可以自己写个String类 答案:不可以,因为 根据类加载的双亲委派机制,会去加载父类,父类发现冲突了String就不再加载了; (2)能否在加载类的时候,对类的 ...
- WPF——如何为项目设置全局样式。
在项目中,需要为所有的Button.TextBox设置一个默认的全局样式,一个个的为多个控件设置相同的样式显然是不明智的.在WPF中可以通过资源设置全局样式,主要有俩种方法: 1.第一种就是先写好按钮 ...
- Linux性能分析——分析系统性能相关的命令
Linux性能分析——分析系统性能相关的命令 摘要:本文主要学习了Linux系统中分析性能相关的命令. ps命令 ps命令用来显示系统中进程的运行情况,显示的是当前系统的快照. 基本语法 ps [选项 ...
- Javase之集合体系(3)之Set及其子类知识
集合体系之Set及其子类知识 Set(接口) public interface Set<E>extends Collection<E> 特点:无序(存储顺序与取出顺序不一致 ...
- Mac进行Flutter开发的配置
可以参数Flutter中文网提供的方法: https://flutterchina.club/setup-macos/ 使用镜像 由于国内访问Flutter有时会受到限制(博主公司网络自带VPN没有这 ...
- WC个人项目
一.Github项目地址: https://github.com/JakeYi/WC 二.PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟) ...
- (转载)林轩田机器学习基石课程学习笔记1 — The Learning Problem
(转载)林轩田机器学习基石课程学习笔记1 - The Learning Problem When Can Machine Learn? Why Can Machine Learn? How Can M ...
- Node.js实现热加载
不管是node.js原生开发,还是借助express,kora等框架开发node.js的情况下,在对代码做出更新后,都是需要重启已生效我们的文件的. 本文记录一次在原生node.js开发的时候,为项目 ...
- 7.Python网络编程_多线程共享全局变量问题
Python多线程支持全局变量的共享操作,但是它存在很多问题,先来看以下程序,该程序理论上执行完毕后全局变量g_num的值应该是2000000,但是在实际运行中,结果不足理论值 import thre ...
- python,adb,分别给多个设备安装多个apk文件,os.popen(); os.system; os.path.splitext(); a.split(' \t'); readlines(); append(); os.path.join(); time.sleep();
#encoding:utf-8import os,time#=======================查找手机设备序列号=============a='adb devices'b=os.popen ...