什么是发布订阅模式?

发布—订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。在JavaScript开发中,我们一般用事件模型来替代传统的发布—订阅模式。

发布订阅模式的构成

最常见的发布订阅模式就是咱们DOM事件,仔细回想一下我们要给一个按钮,绑定一个事件,当我点击按钮的时候我要让他的颜色变了,并且页面弹出一个弹出框

我们分析一下这个流程

首先,我们得知道给哪个按钮的时候绑定事件,然后我们得知道触发事件以后需要干什么?

那么在这其中谁是发布者

是DOM中的按钮,因为是在它身上绑定了事件,当我们点击按钮的时候它便像订阅者发布了这个消息

那么谁是订阅者

是click事件,当点击按钮时,dom发布了一条消息,而事件订阅了它,所以当它被点击的时候,订阅者会接收到消息

简单例子

以售楼处售楼为例子,售楼处都有一个花名册,然后当卖房的时候会给花名册里面的人依次发短信

var salesOffices = {}; // 定义售楼处salesOffices.clientList = []; // 缓存列表,存放订阅者的回调函数,也就是花名册salesOffices.listen = function( fn ){ // 增加订阅者this.clientList.push( fn ); // 订阅的消息添加进缓存列表,也就是把一个买房的放进花名册里面
};salesOffices.trigger = function(){ // 发布消息//依次查看花名册里面的人,看他们需要什么样的房for( var i = 0, fn; fn = this.clientList[ i++ ]; ){//然后发短信告诉他们fn.apply( this, arguments ); // (2) // arguments 是发布消息时带上的参数}
};salesOffices.listen( function( price, squareMeter ){ // 小明订阅消息即小明有一个这样买房的需求,然后我就把它添加到花名册里面去,小明没有明确的买房具体要求console.log( '价格= ' + price );console.log( 'squareMeter= ' + squareMeter );
});//售楼处发布了一个消息,有一个88平米,售价200万的房
salesOffices.trigger( 2000000, 88 ); // 输出:200万,88平方米//发布完以后小明就收到了消息,这就是发布-订阅模式

现在大家大概都有点理解了什么是发布订阅模式了吧?

如果大家再不理解的话,我再举一个通俗的例子:

上大学的时候甲和乙要打游戏,下午的课不准备去了,然后甲跟丙说,如果下午老师问我去哪了,你就发信息告诉我,已跟丙说,如果下午老师问我去哪了,你就发信息告诉我。然后果然不出所料,下午老师来了,并且问了甲和已去哪了?然后丙发信息给甲和已了,甲和已收到信息后干什么丙不知道,丙只是负责如果老师问了就发短信给甲和已。

这样能听明白了吗?所以发布订阅设计模式要先订阅消息,然后再等到发布消息的时候就能触发事件

上面的例子是如果只要有房卖就告诉小明,什么消息都会告诉小明

现在小明只想要80平米的房子的消息,我们来优化一下

var salesOffices = {}; // 定义售楼处
salesOffices.clientList = {}; // 缓存列表,存放订阅者的回调函数
salesOffices.listen = function( key, fn ){if ( !this.clientList[ key ] ){ // 如果还没有订阅过此类消息,给该类消息创建一个缓存列表this.clientList[ key ] = [];}this.clientList[ key ].push( fn ); // 订阅的消息添加进消息缓存列表
};
salesOffices.trigger = function(){ // 发布消息var key = Array.prototype.shift.call( arguments ), // 取出消息类型fns = this.clientList[ key ]; // 取出该消息对应的回调函数集合if ( !fns || fns.length === 0 ){ // 如果没有订阅该消息,则返回return false;}for( var i = 0, fn; fn = fns[ i++ ]; ){fn.apply( this, arguments ); // (2) // arguments是发布消息时附送的参数}
};
salesOffices.listen( 'squareMeter88', function( price ){ // 小明订阅88平方米房子的消息console.log( '价格= ' + price ); // 输出: 2000000
});salesOffices.trigger( 'squareMeter88', 2000000 ); // 发布88平方米房子的价格,小明能收到
salesOffices.trigger( 'squareMeter110', 3000000 ); // 发布110平方米房子的价格,小明收不到

这就是一个比较常用的发布订阅的设计模式了,下一篇进行重点讲解,本篇先了解一下什么是发布订阅模式,也就是观察者模式

JavaScript 设计模式之发布-订阅模式(上)相关推荐

  1. JavaScript设计模式之发布-订阅模式(观察者模式)-Part1

    <JavaScript设计模式与开发实践>读书笔记. 发布-订阅模式又叫观察者模式,它定义了对象之间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖它的对象都将得到通知. 例如 ...

  2. JavaScript 设计模式之发布-订阅模式(下)

    发布-订阅模式的通用实现 现在我们在上一篇文章中已经看到了如何让售楼处拥有接受订阅和发布事件的功能.假设现在小明又去另一个售楼处买房子,那么这段代码是否必须在另一个售楼处对象上重写一次呢,有没有办法可 ...

  3. Javascript设计模式之发布-订阅模式

    简介 发布-订阅模式又叫做观察者模式,他定义了一种一对多的依赖关系,即当一个对象的状态发生改变的时候,所有依赖他的对象都会得到通知. 回忆曾经 作为一名前端开发人员,给DOM节点绑定事件可是再频繁不过 ...

  4. Javascript中理解发布--订阅模式

    Javascript中理解发布--订阅模式 阅读目录 发布订阅模式介绍 如何实现发布--订阅模式? 发布---订阅模式的代码封装 如何取消订阅事件? 全局--发布订阅对象代码封装 理解模块间通信 回到 ...

  5. 设计模式-观察者模式 发布/订阅模式

    设计模式-观察者模式 发布/订阅模式 代码 观察者接口 public interface IHanFeiZi{// 当吃早饭时public void havBreakFast();// 进行娱乐活动时 ...

  6. 【设计模式】692- TypeScript 设计模式之发布-订阅模式

    前言 在之前两篇自测清单中,和大家分享了很多 JavaScript 基础知识,大家可以一起再回顾下~ 本文是我在我们团队内部"「现代 JavaScript 突击队」"分享的一篇内容 ...

  7. 设计模式之发布订阅模式

    发布--订阅模式简介 发布--订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,多个观察者对象都依赖于一个目标对象,当目标对象的状态发生变化时,所有依赖于这个对象的观察者对象都会收到通知. ...

  8. 从东京奥运会看js设计模式之发布订阅模式

    开篇废话:本篇文章介绍发布-订阅模式,想必很多人听说过有一种观察者模式,网上既有资料说这是两种不同的设计模式,也有说这是一种模式,我倾向于认同他们是同一种设计模式.不必过于纠结 开篇楔子:东京奥运会已 ...

  9. 浅析javascript观察者模式(发布-订阅模式)与应用

    观察者模式(Observer):又称作发布-订阅模式或消息机制,定义了一种依赖关系,解决了主体对象与观察者之间功能的耦合. 发布订阅模式可以解决主体对象与观察者之间功能的耦合. 举个栗子,一架飞机要从 ...

最新文章

  1. GUI学习之十四——QAbstractSpinBox学习总结
  2. Java创建一个文件变量_java如何定义一个类,创建它的成员变量和方法?
  3. 消息队列--RabbitMQ简单使用
  4. java之for循环
  5. k8s从入门到放弃--使用kubeadm快速安装kubernetes
  6. python 3_Python3 列表
  7. SpringBoot(10)
  8. echarts的legend显示不全_Echarts【1、数据过多导致显示不全分页,2、数据展示探讨分析】...
  9. 如果股市出现震荡行情,投资者应如何应对?
  10. Ubuntu18.04LTS+Anaconda+Tensorflow-GPU安装记录
  11. 罗永浩直播首秀开卖小米 10;微信能转账 QQ;Ruby 2.7.1 发布 | 极客头条
  12. 使用zend studio配置Xdebug调试PHP教程
  13. 解决windows 2003 无法安装vss2005的问题
  14. 从零到一,美芽的技术实战
  15. PhotoShop修改图片文字
  16. 人员管理系统+报销系统
  17. linux mysql changed limits_ubuntu下mysql提示Changed limits: max_open_files:1024解决办法
  18. 极飞P20植保无人机测评
  19. 印象笔记Android怎样创建md,LocalNote,让你像使用本地文件一样使用印象笔记(支持 markdown 格式)...
  20. webstorm常用插件 最后一个最好

热门文章

  1. VAE(变分自编码器)原理简介
  2. 服务器装什么操作系统好?
  3. 解决报错:Cause: java.sql.SQLSyntaxErrorException: Table 'myactiviti.act_ge_property' doesn't exist
  4. 用Powerpoint (PPT)制作并导出矢量图、高分辨率图
  5. php裁剪上传图片生成缩略图
  6. 区块链 -> 区块链简介
  7. Scala:Map集合的使用
  8. Html a标签的用法
  9. 高等数学:第三章 微分中值定理与导数的应用(2)罗必达法则
  10. 如何判断两个IP地址是不是同一个网段(超实用)