• 主页
  • 归档
我的文章 友链 关于我

  • 主页
  • 归档

初识'发布订阅模式'和'观察者模式'-- Vue3中实现eventBus

2024-04-27

发布订阅模式和观察者模式

观察者模式

观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新

观察者模式属于行为型模式,行为型模式关注的是对象之间的通讯,观察者模式就是观察者和被观察者之间的通讯

发布订阅模式

发布-订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者)。而是将发布的消息分为不同的类别,无需了解哪些订阅者(如果有的话)可能存在

同样的,订阅者可以表达对一个或多个类别的兴趣,只接收感兴趣的消息,无需了解哪些发布者存在

差别

  • 在观察者模式中,观察者是知道Subject的,Subject一直保持对观察者进行记录。然而,在发布订阅模式中,发布者和订阅者不知道对方的存在。它们只有通过消息代理进行通信。

  • 在发布订阅模式中,组件是松散耦合的,正好和观察者模式相反。

  • 观察者模式大多数时候是同步的,比如当事件触发,Subject就会去调用观察者的方法。而发布-订阅模式大多数时候是异步的(使用消息队列)

用ts手写一个简单的发布订阅模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
type BusClass = {
emit: (name: string) => void
on: (name: string, callback) => void
}

type ParamskKey = string | number | symbol
type List = {
[key: ParamsKey]: Array<Function>
}//定义调度中心的类型,即一个消息对应一个带有订阅该消息的订阅者的回调函数

class Bus implements BusClass {
list: List
constructor() {
this.list = {}
}
emit (name: string, ...args:Array<any>) {
let fn:Array<Function> = this.list[name]
fn.forEach(fn => {
fn.apply(this,args)
})//循环发布给订阅者订阅信息
}

on (name:string, callback:Function) {
let fn:Array<Function> = this.list[name] || [] //获取当前信息的订阅回调函数,没有则初始化一个空数组
fn.push(callback) //把当前的订阅回调函数加入数组
this.list[name] = fn //赋值回去
}
}

使用演示

1
2
3
4
5
6
7
8
9
10
//派发组件
const emit = () => {
count++
Bus.emit('on-click',count)
}

//订阅组件
Bus.on('on-click',(flag:number) => {
console.log(count)//在终端输出的就是发布者的数据
})
  • 模式设计
  • 发布订阅模式
  • 观察者模式
  • eventBus

扫一扫,分享到微信

微信分享二维码
深入v-model--自定义组件中v-model
Vue3中provide和inject的应用与原理
  1. 1. 发布订阅模式和观察者模式
    1. 1.1. 观察者模式
    2. 1.2. 发布订阅模式
  2. 2. 用ts手写一个简单的发布订阅模式
© 2024 xixiIBN5100
  • 我的文章
  • 友链
  • 关于我

tag:

  • 新的开始
  • vue源码
  • diff算法
  • patch
  • vue
  • Ref
  • 响应式
  • 源码
  • computed
  • watch
  • 方法逻辑
  • typescript
  • 复选框
  • sass
  • css
  • bem
  • 全局组件
  • 递归组件
  • 动态组件
  • slot
  • 异步组件
  • 骨架屏
  • 性能优化
  • 提高用户体验
  • 缓存组件
  • provide
  • inject
  • 模式设计
  • 发布订阅模式
  • 观察者模式
  • eventBus
  • v-model
  • 自定义组件
  • 自定义指令
  • 防抖
  • 节流
  • 图片懒加载
  • 自定义插件
  • eventLoop
  • nextTick
  • Vue底层
  • 备忘录
  • webpack
  • 配置操作
  • 面试题
  • js
  • API
  • vue router
  • router4
  • 命名视图
  • 重定向
  • 路由元信息
  • 网络
  • 面试
  • Vue的设计与实现

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • zzbond
  • 钠盐酱
  • Tancy
  • 过路人
  • 橙汁
  • jj
沉淀