假如你要建立一个网站,通常来说会有许多用户。你作为一名管理者,有时候需要将重要的消息发布给你的用户。在软件开发领域,开发此功能往往用到发布订阅者模式。下面我以简单的javascript来说明。

  1. 定义发布者类。发布者最基本的两个属性:发送的消息,发送的人
function Publisher() {this.observers =[]; // 存储需要发布消息的人this.state="hello"  // 发送的消息
}
复制代码

除此之外,一个Publisher还需要有能够接纳新的订阅消息的人的功能,或者删除某个订阅者的功能,同时需要能够将消息发送出去的功能。

// 新增订阅者功能
Publisher.prototype.addUser=function(obj) {const nameList= this.observers.map(item=>{return item.name;})if(nameList.indexOf(obj.name) < 0) {this.observers.push(obj)}return this;
}
//删除订阅者功能
Publisher.prototype.deleteUser=function(obj){let index = -1this.observers.forEach((item,key)=>{if(item.name === obj.name){index = key}})if(index !== -1) {this.observers.splice(index,1)}return this
}
// 通知订阅者功能
Publisher.prototype.noticeUser=function(data){ this.observers.forEach((item)=>{item.update(data)})
}
复制代码

值得注意的是,上述通知订阅者的功能是通过遍历this.observers 并调用每一个订阅者的update方法。所以每一个订阅者需要对应有update方法。每一个订阅者的类似结构如下:

[{name:'张三',update:(data)=>{console.log(data)}},{name:'李四',update:(data)=>{console.log(data)}},...
]
复制代码
  1. 构造订阅者对象,由于每一个订阅者都有name属性和update方法。最简单的就是采用构造函数方法来实现
function Subscribe(name){this.name =name;this.update = function(data){console.log(data);};
}
复制代码
  1. 有了Subscribe模板,我们开始构造出每一个具体的订阅者实例出来。
let lisi = new Subscribe('lisi')
let xiaoming = new Subscribe('xiaoming')
复制代码
  1. 将构造的订阅人lisi 和 xiaoming 加入到发布者对象的observer中
let pb = new Publisher()
pb.addUser(lisi)
pb.addUser(xiaoming)
复制代码
  1. 发布者需要发布消息时:
pb.noticeUser("hello")
复制代码

至此一个最简单的发布订阅者模式实现了,这里还有两点优化建议。
第一,上述构造出来的lisi,xiaoming都会自动有update方法,并且update的行为都是一样的,如果需要例如xiaoming的update与其他不同,只需要重新定义即可

xiaoling.update=(data)=>{console.log("hello"+data)}
pb.addUser(xiaoling)
复制代码

第二, 发布者需要手动调用pb.noticeUser()去通知state消息,可以做到state变动了自动去调用pb.noticeUser()吗?可以的,此时 Object.defineProperty()就派上用场了

let pb = new Publisher()
Object.defineProperty(pb,'state',{set:function(newVal,) {let a = thisdebuggerpb.noticeUser(newVal)   }
})
pb.addUser(lisi)
pb.addUser(xiaoming)
pb.state = '123'
//pb.noticeUser()
复制代码

如果state变化了将自动触发pb.noticeUser(),实现自动通知功能,是不是有点Vue原理既视感!

JavaScript发布订阅者模式相关推荐

  1. JavaScript 发布订阅者模式和观察者模式及区别

    一.发布订阅模式 发布订阅模式其实是一种对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到状态改变的通知. 多方订阅,一方发布,订阅放会收到通知 举例:教学楼中每个教室都有 ...

  2. JavaScript 发布-订阅模式

    发布-订阅模式,看似陌生,其实不然.工作中经常会用到,例如 Node.js EventEmitter 中的 on 和 emit 方法:Vue 中的 $on 和 $emit 方法.他们都使用了发布-订阅 ...

  3. JavaScript设计模式 -发布订阅者模式

    1. 定义 发布订阅者模式又叫观察者模式,他定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得将得到通知 案例: 小明最近看上了一套房子,到了售楼处之后才被告知,该楼 ...

  4. JavaScript设计模式:观察者模式与发布订阅者模式实现

    观察者模式 当对象之间存在一对多的依赖关系时,其中一个对象的状态发生改变,所有依赖它的对象都会收到通知,这就是观察者模式. 在观察者模式中,只有两种主体:目标对象 (Subject) 和 观察者 (O ...

  5. 用Java语言编写ajax设计模式_使用JavaScript发布订阅设计模式实现Ajax请求节流

    1. 说明一下主要逻辑 当我们发送多个请求时使用的时同一个接口,并且这个接口支持多个参数获取多个条数据,而我们不想要每次请求一条数据就发送一条请求 而是在指定的时间段类发送一次请求,得到一些数据,然后 ...

  6. ActiveMQ之发布- 订阅消息模式实现

    一.概念 发布者/订阅者模型支持向一个特定的消息主题发布消息.0或多个订阅者可能对接收来自特定消息主题的消息感兴趣.在这种模型下,发布者和订阅者彼此不知道对方.这种模式好比是匿名公告板.这种模式被概括 ...

  7. Spring Boot基础学习笔记25:RabbitMQ - 发布/订阅工作模式

    文章目录 零.学习目标 一.准备工作 (一)创建Spring Boot项目 - PublishSubscribeDemo (二)在应用属性文件里配置RabbitMQ 二.基于API进行消息发布和订阅 ...

  8. Publish/SubScribe(发布/订阅)模式

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

  9. 发布订阅者模式和观察者模式的区别

    发布订阅者模式和观察者模式的区别 1.什么是观察者模式 定义:当对象之间存在一对多的依赖关系时,其中一个对象的状态发生改变,所有依赖它的对象都会收到通知,这就是观察者模式. 在观察者模式中,只有两种主 ...

最新文章

  1. 小姐姐用动图展示 10 大 Git 命令,包你看完过目不忘!
  2. 压力测试工具Jemeter安装及使用
  3. Safari 版本回退方法
  4. 做了5年领导,看到员工年终汇报这么做,也忍不住给他加薪
  5. U-Boot工作过程
  6. 玉伯 对 前端的 金玉良言
  7. 对比select中的distinct影响
  8. 大学新颖的管理系统毕业设计题目50例
  9. 决策树实现手写体识别
  10. BCH的51攻击与防守
  11. 电子商务网站设计与实现
  12. MySQL数据库锁介绍
  13. 你必须懂!也可以懂的@Transactional原理!
  14. java 完整子图_用JAVA求解最大连通子图
  15. 高德地图 自定义marker
  16. excel办公自动化工具
  17. WebView加载Html片段监听滑动到底部
  18. Python中语音播报的应用(简单版)
  19. HTML 获取屏幕、浏览器、页面的高度宽度
  20. 帝国CMS怎么新增加专题页面 帝国cms增加专题图文详解

热门文章

  1. 天气小工具新增风格-默认无背景,感谢欧阳兄制作
  2. UA MATH564 概率论 QE练习题 概率极限理论
  3. UA MATH565C 随机微分方程III Ito积分的构造下
  4. C# 使用new 关键字显式隐藏从基类继承的成员和内部类的使用
  5. VC++6绘制GIS地图不同类型的点
  6. jquery $.each()函数编程实例五则图解
  7. sql server 补齐0学习总结
  8. html and js 的隔行换背景色表格实例详解
  9. echarts 样式 配置 vue
  10. 设计模式学习笔记-状态模式