当前位置:网站首页>它们不一样!透析【观察者模式】和【发布订阅模式】
它们不一样!透析【观察者模式】和【发布订阅模式】
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 个或多个订阅者对象;
- 发布者绑定调度中心;
- 调度中心绑定订阅者;
- 发布者发布消息;


小结
边栏推荐
- The situation of the solution of the equation system and the correlation transformation of the vector group
- 使用pymongo,将MongoDB生成的ObjectId类型数据与字符串之间的相互转化
- Understanding of redis slice cluster
- leetcode/删除链表的倒数第n个结点
- Jingdong T9 pure hand type 688 pages of god notes, SSM framework integrates Redis to build efficient Internet applications
- [Online interviewer] How to achieve deduplication and idempotency
- 【kali-权限提升】(4.2.5)社会工程学工具包:PowerShell攻击向量(防报毒)
- hdu2475 Box
- 科创人·优锘科技COO孙岗:错误问题找不到正确答案,求索万物可视的大美未来
- bzoj2816 [ZJOI2012] Network
猜你喜欢
Dry goods: design high concurrency architecture from scratch
Kubernetes二进制部署高可用集群
‘xxxx‘ is declared but its value is never read.Vetur(6133)
华为云分布式缓存服务Redis开通及使用规划教程【华为云至简致远】
腾讯云产品可观测最佳实践 (Function)
All volunteers V853 chip Tina RTSP environment set up
【kali-权限提升】(4.2.5)社会工程学工具包:PowerShell攻击向量(防报毒)
C#/VB.NET 将PDF转为PDF/X-1a:2001
ERROR Failed to compile with 1 error
LED显示屏在会议室如何应用
随机推荐
Streamsets Data Collector 3.12
【kali-权限提升】(4.2.5)社会工程学工具包:PowerShell攻击向量(防报毒)
Power BI简介
带你玩转“超大杯”ECS特性及实验踩坑【华为云至简致远】
OpenAI怎么写作「谷歌小发猫写作」
用于视觉语言导航的自监督三维语义表示学习
9.cuBLAS开发指南中文版--cuBLAS中的原子模式的配置
C语言学习概览(四)
使用 Pygame 构建和可视化数独游戏
腾讯云产品可观测最佳实践 (Function)
全网首发!消息中间件神仙笔记,涵盖阿里十年技术精髓
hdu2475 Box
Introduction to Power BI
2022年中国全民健身发展白皮书
The situation of the solution of the equation system and the correlation transformation of the vector group
【MATLAB项目实战】基于Morlet小波变换的滚动轴承故障特征提取研究
UTF-8 BOM文件导致配置文件无法读取
跟我一起来学弹性云服务器ECS【华为云至简致远】
VIT:Transformer进军CV的里程碑
使用pymongo保存数据到MongoDB的工具类