当前位置:网站首页>一文讲解发布者订阅者模式与观察者模式
一文讲解发布者订阅者模式与观察者模式
2022-07-01 02:50:00 【我的名字豌豆】
区别
观察者模式:当对象之间存在一对多的依赖关系时,其中一个对象的状态发生改变,所有依赖它的对象都会收到通知,这就是观察者模式。
发布者订阅者模式:基于一个事件通道,希望接收通知的对象Subscriber 通过自定义事件订阅主题,被激活事件的对象 Publisher 通过发布主题事件的方式通知订阅者该主题的 Subscriber 对象。
观察者模式是,当被观察者的数据发生变化时,调用被观察者的notify方法,去通知所有观察者执行update方法进行更新。对于发布者订阅者模式,首先发布者与订阅者互相并不知道彼此的存在,他们是通过事件中心来进行调度的,发布者在事件中心发布一个对应的事件主题,订阅者在事件中心订阅一个事件主体,当订阅者去触发emit时就去执行发布者所发布的事件。
Vue展示了其设计模式的案例体现,Vue的双向数据绑定使用了观察者模式,其事件总线EventBus使用了发布者订阅者模式。
实现
手写发布者订阅者模式
class EventEmitter {
constructor() {
this.events = {
}
}
on(name, fn) {
if (this.events[name]) {
this.events[name].push(fn)
} else {
this.events[name] = [fn]
}
}
off(name, fn) {
this.events[name] = this.events[name].filter(event => event != fn)
}
once(name, fn) {
let one = (...args) => {
fn(...args)
this.off(name, one)
}
this.on(name, one)
}
emit(name, ...args) {
this.events[name].forEach(event => {
event.apply(this, args)
})
}
}
let ev = new EventEmitter()
let func = function () {
console.log("我是小刘")
}
ev.on("name",func)
ev.once("name1", function () {
console.log("我是小李")
})
ev.emit("name1")
ev.emit("name")
// 注销对应的事件
ev.off("name", func)
// 触发对应的事件
ev.emit("name")
手写观察者模式
// 被观察的目标,即发布者:Dep
// 被观察的目标,即发布者:Dep
class Dep {
constructor() {
// 记录所有的观察者,即订阅者
this.subs = []
}
// 添加新的观察者
addSub(sub) {
// 该订阅者存在且有update方法,就将其添加到subs数组中
if (sub && sub.update) {
this.subs.push(sub)
}
}
// 移除观察者
removeSub(sub) {
if (this.subs.length) {
let index = this.subs.indexOf(sub)
if (index > -1) {
this.subs.splice(index, 1)
}
}
}
// 发布更新通知
notify() {
this.subs.forEach(item => {
item.update()
})
}
}
// 观察者,即订阅者
class Watcher {
update() {
console.log("****更新相关数据****")
}
}
let dep = new Dep
let watcher1 = new Watcher()
let watcher2 = new Watcher()
// 添加新的观察者
dep.addSub(watcher1)
dep.addSub(watcher2)
dep.removeSub(watcher2)
// 发布
dep.notify()
边栏推荐
- Pulsar geo replication/ disaster recovery / regional replication
- 园区运营效率提升,小程序容器技术加速应用平台化管理
- 产业互联网中,「小」程序有「大」作为
- 记一次服务部署失败问题排查
- Densenet network paper learning notes
- The latest wechat iPad protocol code obtains official account authorization, etc
- Voici le programme de formation des talents de SHARE Creators!
- Codeforces Round #416 (Div. 2) C. Vladik and Memorable Trip
- 单片机 MCU 固件打包脚本软件
- Nacos configuration center tutorial
猜你喜欢

js中的图片预加载

Restcloud ETl数据通过时间戳实现增量数据同步

RestCloud ETL WebService数据同步到本地

产业互联网中,「小」程序有「大」作为

Xception学习笔记

联想X86服务器重启管理控制器(XClarity Controller)或TSM的方法

AI 边缘计算平台 - BeagleBone AI 64 简介

小程序自定义顶部导航栏,uni-app微信小程序自定义顶部导航栏

5款主流智能音箱入门款测评:苹果小米华为天猫小度,谁的表现更胜一筹?

Detailed explanation of pointer array and array pointer (comprehensive knowledge points)
随机推荐
Pulsar theme compression
记一次服务部署失败问题排查
股票开账户如何优惠开户?还有,在线开户安全么?
SAP ALV summary is inconsistent with exported excel summary data
Mouse over effect II
Desai wisdom number - other charts (parallel coordinate chart): employment of fresh majors in 2021
Evaluation of the entry-level models of 5 mainstream smart speakers: apple, Xiaomi, Huawei, tmall, Xiaodu, who is better?
Pycharm 打开远程目录 Remote Host
Voici le programme de formation des talents de SHARE Creators!
Contrastive learning of Class-agnostic Activation Map for Weakly Supervised Object Localization and
RestCloud ETL实践之无标识位实现增量数据同步
ipmitool下载地址和编译安装时可能出现的问题
鼠标悬停效果六
Pychart software deployment gray unable to point
【小程序项目开发-- 京东商城】uni-app之分类导航区域
Codeforces Round #416 (Div. 2) C. Vladik and Memorable Trip
鼠标悬停效果二
DenseNet网络论文学习笔记
Mouse over effect 7
If I am in Beijing, where is a better place to open an account? In addition, is it safe to open a mobile account?