首页 > 其他分享 >订阅发布模式和观察者模式区别

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

时间:2022-11-28 23:25:51浏览次数:38  
标签:订阅 subs eventType update 模式 观察者 sub

1. 发布/订阅模式

  • 发布/订阅模式
    • 订阅者
    • 发布者
    • 信号中心

我们假定,存在一个"信号中心",某个任务执行完成,就向信号中心"发布"(publish)一个信 号,其他任务可以向信号中心"订阅"(subscribe)这个信号,从而知道什么时候自己可以开始执 行。这就叫做"发布/订阅模式"(publish-subscribe pattern)

Vue 的自定义事件

let vm = new Vue()
vm.$on('dataChange', () => { console.log('dataChange')})
vm.$on('dataChange', () => { 
  console.log('dataChange1')
}) 
vm.$emit('dataChange')
123456

兄弟组件通信过程

// eventBus.js
// 事件中心
let eventHub = new Vue()

// ComponentA.vue
// 发布者
addTodo: function () {
  // 发布消息(事件)
  eventHub.$emit('add-todo', { text: this.newTodoText }) 
  this.newTodoText = ''
}
// ComponentB.vue
// 订阅者
created: function () {
  // 订阅消息(事件)
  eventHub.$on('add-todo', this.addTodo)
}
1234567891011121314151617

模拟 Vue 自定义事件的实现

class EventEmitter {
  constructor(){
    // { eventType: [ handler1, handler2 ] }
    this.subs = {}
  }
  // 订阅通知
  $on(eventType, fn) {
    this.subs[eventType] = this.subs[eventType] || []
    this.subs[eventType].push(fn)
  }
  // 发布通知
  $emit(eventType) {
    if(this.subs[eventType]) {
      this.subs[eventType].forEach(v=>v())
    }
  }
}

// 测试
var bus = new EventEmitter()

// 注册事件
bus.$on('click', function () {
  console.log('click')
})

bus.$on('click', function () {
  console.log('click1')
})

// 触发事件 
bus.$emit('click')
1234567891011121314151617181920212223242526272829303132

2. 观察者模式

  • 观察者(订阅者) –

    Watcher
    
    • update():当事件发生时,具体要做的事情
  • 目标(发布者) –

    Dep
    
    • subs 数组:存储所有的观察者
    • addSub():添加观察者
    • notify():当事件发生,调用所有观察者的 update() 方法
  • 没有事件中心

// 目标(发布者) 
// Dependency
class Dep {
  constructor () {
    // 存储所有的观察者
    this.subs = []
  }
  // 添加观察者
  addSub (sub) {
    if (sub && sub.update) {
      this.subs.push(sub)
    }
  }
  // 通知所有观察者
  notify () {
    this.subs.forEach(sub => sub.update())
  }
}

// 观察者(订阅者)
class Watcher {
  update () {
    console.log('update')
  }
}

// 测试
let dep = new Dep()
let watcher = new Watcher()
dep.addSub(watcher) 
dep.notify()
12345678910111213141516171819202122232425262728293031

3. 总结

  • 观察者模式是由具体目标调度,比如当事件触发,Dep 就会去调用观察者的方法,所以观察者模 式的订阅者与发布者之间是存在依赖的
  • 发布/订阅模式由统一调度中心调用,因此发布者和订阅者不需要知道对方的存在

img

标签:订阅,subs,eventType,update,模式,观察者,sub
From: https://www.cnblogs.com/guibi/p/16934107.html

相关文章

  • [Kogel.Subscribe.Mssql]SQL Server增量订阅,数据库变更监听
    此框架是SQLServer增量订阅,用来监听增删改数据库数据变更目前仅支持SQLServer,Nuget上可以下载安装或者使用Nuget命令添加包dotnetaddpackageKogel.Subscribe.Mssq......
  • 大数据架构设计模式主要考虑八方面问题
    ​在架构设计中,没有万能的软件架构能解决所有问题,不同的场景、需求、限制下需要有针对性的架构模式才能满足项目需求。大数据架构设计模式中,需要从分层、分割、分布式、集群......
  • 大数据架构设计模式主要考虑八方面问题
     在架构设计中,没有万能的软件架构能解决所有问题,不同的场景、需求、限制下需要有针对性的架构模式才能满足项目需求。大数据架构设计模式中,需要从分层、分割、分布式、集......
  • jmeter 读取csv数据文件之共享模式
    在工作中经常使用jmeter的csv数据文件来实现参数化,但csv文件的线程共享模式在使用时却很少关注。1.csv线程共享模式分为3种模式,分别为“所有现场”、“当前线程组”和“当......
  • Docker 搭建Redis集群(哨兵模式)
    一、简介Redis集群的哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而......
  • vs2012 发布网站Release发布模式 any cpu 与.net与mixed platforms 有什么区别?
    https://zhidao.baidu.com/question/304148101202171804.html这是目标平台的设定。一般来说包括但不局限于以下:x86:将程序集编译为由兼容x86的32位公共语言运行库(CLR)......
  • 详述怎么使用Linux救援模式
    当你的Linux系统出现问题时你会怎么办,直接重新安装,还是用Linux救援模式。或许你对这个模式很陌生但是并不妨碍他会对你有很大的帮助,可以帮你挽回很多重要的数据,是你不必很伤......
  • 【JS】165-JavaScript设计模式——工厂模式
    二、工厂模式(FactoryPattern)1.概念介绍工厂模式的目的在于创建对象,实现下列目标:可重复执行,来创建相似对象;当编译时位置具体类型(类)时,为调用者提供一种创建对象的接口;通过......
  • 【JS】164-JavaScript设计模式——单体模式
    一、单体模式(SingletonPattern)1.概念介绍单体模式(SingletonPattern)的思想在于保证一个特定类仅有一个实例,即不管使用这个类创建多少个新对象,都会得到与第一次创建的对......
  • 观察者模式在spring中的应用
    作者:王子源1观察者模式简介1.1定义指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订......