当前位置:网站首页>它们不一样!透析【观察者模式】和【发布订阅模式】
它们不一样!透析【观察者模式】和【发布订阅模式】
2022-08-08 16:13:00 【InfoQ】
简介
- 观察者 Observer
- 被观察者 Subject
- 订阅者 subscriber (类似于观察者)
- 发布者 publisher (类似于被观察者)
- 调度中心(中间商)

观察者模式
class Subject{// 被观察者
constructor(){
this.observers=[]
}
add(observer){
this.observers.push(observer)
}
notify(newMsg){
this.observers.forEach(i=>i.consoleFn(newMsg))
}
}
class Observer{// 观察者
constructor(name){
this.name=name
}
consoleFn(newMsg){
console.log(newMsg + '======》》》'+ this.name +'收到了')
}
}
let sub = new Subject()
let observer1 = new Observer("观察者1")
let observer2 = new Observer("观察者2")
sub.add(observer1) // Observer1 观察 sub
sub.add(observer2) // Observer2 观察 sub
sub.notify("我是被观察者,我发布了一个信息!") // sub 发布消息
// 我是被观察者,我发布了一个信息!======》》》观察者1收到了
// 我是被观察者,我发布了一个信息!======》》》观察者2收到了
- 写一个 Subject 类,有:添加观察者 add、通知观察者 notify 方法(也可补充写删除观察者 del 方法);
- 写一个 Observer 类,打印出所接收到的信息;
- 实例化一个被观察者;
- 实例化一个或多个观察者;
- 用 add 方法进行绑定;
- 用 notify 方法进行通知;
发布订阅模式
// 发布者 Publisher
class Pub {
constructor() {
this.deps = [];
}
addDep(dep) {
this.deps.push(dep);
}
publish(dep) {
this.deps.forEach(item => item === dep && item.notify());
}
}
// 订阅者 Subscriber
class Sub {
constructor(val) {
this.val = val;
}
update(callback) {
callback(this.val)
}
}
// 调度中心
class Dep {
constructor(callback) { // 核心是这个 callback 函数;
this.subs = [];
this.callback = callback;
}
addSub(sub) {
this.subs.push(sub);
}
notify() {
this.subs.forEach(item => item.update(this.callback));
}
}
let pub = new Pub() // 实例化一个发布者
// 实例化一个调度中心,传入一个用于处理数据的函数;
const dep1 = new Dep((data) =>
console.log('我是调度中心,我先把消息处理一下,然后发给 ===》》》', data))
let sub1 = new Sub("订阅者1") // 实例化订阅者1
let sub2 = new Sub("订阅者2") // 实例化订阅者2
pub.addDep(dep) // 发布者绑定调度中心
dep.addSub(sub1) // 调度中心添加订阅者1
dep.addSub(sub2) // 调度中心添加订阅者2
pub.publish(dep) // 发布者把消息推给调度者
// 我是调度中心,我先把消息处理下先 订阅者1
// 我是调度中心,我先把消息处理下先 订阅者2
- 写一个 Pub 发布者类,有添加调度中心 addDep,推送消息 publish 两个方法;
- 写一个 Sub 订阅者类,有获取信息 update 方法;
- 写一个 Dep 调度中心类,有添加订阅者 addSub,通知消息 notify 两个方法;
- 实例化发布者;
- 实例化 1 个或多个调度的对象;
- 实例化 1 个或多个订阅者对象;
- 发布者绑定调度中心;
- 调度中心绑定订阅者;
- 发布者发布消息;


小结
边栏推荐
猜你喜欢
【云原生】-MySQL压测神器HammerDB的部署及使用
Nuxt - 网站接入 51LA 网站统计(详细教程)
【Unity入门计划】制作RubyAdventure02-处理瓦片地图&碰撞
有了这个开源工具后,我五点就下班了!
带你玩转“超大杯”ECS特性及实验踩坑【华为云至简致远】
成员变量和局部变量的区别?
干货:从零设计高并发架构
promise学习笔记
Jingdong T9 pure hand type 688 pages of god notes, SSM framework integrates Redis to build efficient Internet applications
The realization of the salary slip issuing function of WeChat public account + web background
随机推荐
【Unity入门计划】用双血条方法控制伤害区域减血速度
一文搞懂│XSS攻击、SQL注入、CSRF攻击、DDOS攻击、DNS劫持
广东大学生网络安全攻防大赛CTF部分WP
跟我一起来学弹性云服务器ECS【华为云至简致远】
是时候展现真正实力了!揭秘2022华为开发者大赛背后的技术能力
《流浪方舟》首发重现,点我试玩
Guanghong Technology: The company provides manufacturing services for Xiaomi, Samsung, OPPO, Nokia and other products in India
小实验:实现一个用于计算(包括加减乘除)的小程序
使用pymongo,将MongoDB生成的ObjectId类型数据与字符串之间的相互转化
The situation of the solution of the equation system and the correlation transformation of the vector group
垃圾账号不胜其烦,设备指纹快速发现
使用 Pygame 构建和可视化数独游戏
2022年中国全民健身发展白皮书
The realization of the salary slip issuing function of WeChat public account + web background
All volunteers V853 chip Tina RTSP environment set up
使用pymongo保存数据到MongoDB的工具类
leetcode/number of palindromic substrings
Share these new Blender plugins that designers must not miss in 2022
spark集群环境搭建
Using PyGame's Bubble Sort Visualizer