IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 手摸手实现Mini-Observer,还原一把Vue背后的响应式(系列2) -> 正文阅读

[JavaScript知识库]手摸手实现Mini-Observer,还原一把Vue背后的响应式(系列2)

在这里插入图片描述


一、发布者-订阅者模式

这是一种比较常见的设计模式。顾名思义,在这种设计模式下有发布者,订阅者两种角色,
发布者会记录下订阅者的需求,然后等到一个特定时间点会通知到订阅者

二、举例

小明和小强是两位主播,由于最近人气低迷,都想搞一波福利给家人们,提升一下人气。小王想到了iPhone,小李想到了IPad,于是两人不约而同,到了某强北的二楼档口。可惜不巧,iPhone和iPad这几天都没货了,档口老板给他们在需求单上进行登记,等到货了就会通知他们。

分析:

在此例中,小明和小强充当订阅者,档口老板就是发布者。等到货,老板就会给登记用户发拿货通知

三、一步一步完成发布者-订阅者模式

1. 发布者

(1)定义发布者(档口老板)

  class Dep{}

(2)定义一张登记表(subList),并往表中添加客户需求和联系方式

class Dep {
  constructor() {
    // 登记表
    this.subList = []
  }
  addList(sub) {
    this.subList.push(sub)
  }
  // 到货后,老板根据登记表每位用户预留的电话,挨个通知客户
  notify() {
    this.subList.forEach((sub) => {
      sub.phone()
    })
  }
}

(3)到货后,老板根据登记表每位用户预留的电话,挨个通知客户

class Dep {
  constructor() {
    // 登记表
    this.subList = []
  }
  addList(sub) {
    this.subList.push(sub)
  }
  notify() {
    this.subList.forEach((sub) => {
      sub.phone()
    })
  }
}

(4)实例化老板(发布者)

 const boss = new Dep()

至此,老板的动作定义完成。


2. 订阅者

(1)定义订阅者(档口客户)

 class Watcher {}

(2)档口客户需要登记需求,让老板知道他的诉求,并能到货后通知到他

 class Watcher {
  constructor(cb) {
    this.cb = cb
  }
  phone() {
    this.cb()
  }
}

(3)实例化档口客户(订阅者)

const xiaoming = new Watcher(() => {
  console.log('iPhone到货了')
})

const xiaoqiang = new Watcher(() => {
  console.log('iPad到货了')
})

3. 特定执行

console.log('小明需要IPhone,没货了,老板进行登记')
boss.addList(xiaoming)
console.log('小强需要IPad,没货了,老板进行登记')
boss.addList(xiaoqiang)

setTimeout(() => {
  console.log('货来了,老板进行通知')
  boss.notify()
}, 1000)

在这里插入图片描述

4. 全部代码

// 定义发布者(档口老板)
class Dep {
  constructor() {
    // 老板手中的登记表
    this.subList = []
  }
  // 老板往登记表中添加客户需求信息和联系方式
  addList(sub) {
    this.subList.push(sub)
  }
  // 到货后,老板根据登记表预留的电话挨个通知客户
  notify() {
    this.subList.forEach((sub) => {
      sub.phone()
    })
  }
}
// 实例化发布者
const boss = new Dep()

// 定义订阅者(档口客户)
class Watcher {
  constructor(cb) {
    this.cb = cb
  }
  phone() {
    this.cb()
  }
}
// 实例化订阅者
const xiaoming = new Watcher(() => {
  console.log('iPhone到货了')
})
const xiaoqiang = new Watcher(() => {
  console.log('iPad到货了')
})

console.log('小明需要IPhone,没货了,老板进行登记')
boss.addList(xiaoming)
console.log('小强需要IPad,没货了,老板进行登记')
boss.addList(xiaoqiang)

setTimeout(() => {
  console.log('货来了,老板进行通知')
  boss.notify()
}, 1000)

总结

以上就是今天要讲的内容,本文仅仅以一个生活示例,简单介绍了发布者-订阅者模式的机理,其应用场景非常广泛,Vue中的响应式背后就有其影子。

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-26 15:16:28  更:2022-05-26 15:17:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年4日历 -2025/4/22 20:44:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码