深入了解JavaScript发布订阅模式

深入了解JavaScript发布订阅模式

什么是发布订阅模式?

发布订阅模式 是一种解耦的设计模式,它把服 务端提供的所有服务都抽象成订阅事件,客户端只需要订阅自己关注的服务即可,而不需要提前知道服务提供端的具体实现方式。服务端则维护着需要订阅的事件,同时维护了客户端列表,当某个事件被触发时,服务端向关注该事件的所有客户端发送通知。

实现发布订阅模式的步骤

  • 定义事件总线对象
class EventBus {
  constructor() {
    this.events = {}
  }

  // 订阅事件
  on(type, listener) {
    const listeners = this.events[type] || []
    listeners.push(listener)
    this.events[type] = listeners
  }

  // 取消订阅事件
  off(type, listener) {
    const listeners = this.events[type] || []
    this.events[type] = listeners.filter(l => l !== listener)
  }

  // 触发事件
  emit(type, ...args) {
    const listeners = this.events[type] || []
    listeners.forEach(listener => {
      listener.apply(null, args)
    })
  }
}
  • 订阅事件
const bus = new EventBus()
function handleData(data) {
  console.log('handleData', data)
}
bus.on('data', handleData)
  • 触发事件
bus.emit('data', 123)
  • 取消订阅事件
bus.off('data', handleData)

示例1

使用发布订阅模式,来实现一个模拟的登录功能:

class LoginController {
  constructor() {
    this.eventBus = new EventBus()
    this.init()
  }

  init() {
    this.eventBus.on('login', this.login.bind(this))
  }

  login(username, password) {
    console.log(`登录成功:${username}:${password}`)
  }

  doLogin(username, password) {
    this.eventBus.emit('login', username, password)
  }
}

在上面的示例中,我们首先定义了一个 LoginController 类,它维护了一个 EventBus 对象,以便订阅和触发事件。在 init 方法中,我们为 login 事件添加订阅者,它指向 login 方法。login 方法是具体的处理函数,它接收用户名和密码,然后打印出登录成功的信息。最后,我们定义了一个 doLogin 方法,它用于模拟用户登录,并触发 login 事件。

示例2

假设我们正在开发一个音乐播放器,我们需要添加一个进度条和一个音量条,当进度条或音量条值改变时,我们需要订阅这些事件,并更新音乐播放器的UI。代码实现如下:

class MusicPlayer {
  constructor() {
    this.eventBus = new EventBus()
    this.init()
  }

  init() {
    this.eventBus.on('progress', this.updateProgress.bind(this))
    this.eventBus.on('volume', this.updateVolume.bind(this))
  }

  updateProgress(progress) {
    console.log(`updateProgress: ${progress}`)
  }

  updateVolume(volume) {
    console.log(`updateVolume: ${volume}`)
  }

  setProgress(progress) {
    this.eventBus.emit('progress', progress)
  }

  setVolume(volume) {
    this.eventBus.emit('volume', volume)
  }
}

在上面的示例中,我们首先定义了一个 MusicPlayer 类,它维护了一个 EventBus 对象,以便订阅和触发事件。在 init 方法中,我们为 progress 事件和 volume 事件添加订阅者,分别指向了 updateProgress 方法和 updateVolume 方法。 updateProgressupdateVolume 方法是具体的处理函数,它们分别接收进度值和音量值,并打印出更新的信息。最后,我们定义了 setProgress 方法和 setVolume 方法,用于设置进度值和音量值,并触发 progress 事件和 volume 事件。

总结

发布订阅模式是一种非常实用的设计模式,它能够帮助我们解决系统耦合和复杂性的问题。在开发中,只需要定义好订阅事件和处理函数,然后将它们绑定到具体的类和方法中,就可以实现很好的解耦效果。通过上面的示例,我们相信大家已经对发布订阅模式有了一定的了解,希望大家可以在适当的场景中应用到它。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入了解JavaScript发布订阅模式 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • python3连接kafka模块pykafka生产者简单封装代码

    下面我就详细讲解一下“python3连接kafka模块pykafka生产者简单封装代码”的完整攻略。 一、pykafka介绍 pykafka是Python的Kafka连接库之一,它提供了对Kafka的高级别操作接口,同时也支持异步生产和消费消息。 二、使用pykafka连接Kafka服务 我们使用pykafka连接Kafka服务,需要先安装并导入模块。在命令…

    人工智能概论 2023年5月25日
    00
  • 科大讯飞智能键盘K710怎么样?科大讯飞智能键盘K710详细评测

    科大讯飞智能键盘K710详细评测 介绍 科大讯飞智能键盘K710是一款尺寸适中、具备人性化设计的键盘产品。它采用了红轴机械键盘,外观设计充满现代感,功能配置和按键手感也都非常出色,是一款性价比较高的键盘产品,受到了很多用户的追捧。 功能特点 人性化设计:科大讯飞智能键盘K710的编码轮可以用于自由调节音量大小,同时光线感应器可以自动调节亮度,确保键盘在不同的…

    人工智能概览 2023年5月25日
    00
  • 在MongoDB中模拟Auto Increment的php代码

    为了在MongoDB中模拟Auto Increment,在我们的PHP代码中,我们需要实现以下几个步骤: 步骤1:创建计数器集合 我们需要创建一个计数器集合来存储最新的计数器值,以及每个计数器所对应的集合名称。创建计数器集合可以使用MongoDB的原生API或者PHP的MongoDB扩展包来实现。下面的示例代码展示了如何通过PHP的MongoDB扩展包来创建…

    人工智能概论 2023年5月25日
    00
  • Python开发微信公众平台的方法详解【基于weixin-knife】

    Python开发微信公众平台的方法详解【基于weixin-knife】 简介 本文将介绍如何使用Python开发微信公众平台。我们使用的是名为weixin-knife的Python库,该库提供了高层的API让我们更容易地与微信服务器交互。本文将提供具体的步骤来实现微信公众平台的开发。如果您还不了解什么是微信公众平台,您可以先阅读官方文档(https://mp…

    人工智能概览 2023年5月25日
    00
  • 基于web管理OpenVPN服务的安装使用详解

    基于web管理OpenVPN服务的安装使用详解 简介 OpenVPN是一种开放源代码的虚拟专用网络(VPN)软件。它可以用于建立安全的站点到站点连接或远程访问网络。 本文将介绍如何在Ubuntu 18.04上安装OpenVPN和web管理界面,方便用户管理OpenVPN服务。 安装OpenVPN和Web管理界面 安装OpenVPN和必要的依赖项 $ sudo…

    人工智能概览 2023年5月25日
    00
  • 苹果iOS 15正式发布:全新通知界面、天气、照片、钱包大改进

    苹果iOS 15正式发布:全新通知界面、天气、照片、钱包大改进 苹果iOS 15于2021年9月20日正式发布,为苹果设备用户带来了许多全新的功能和改进。以下是iOS 15的详细攻略。 1. 全新通知界面 iOS 15的通知管理得到了全面优化和改进,包括重要联系人和应用通知的高亮显示、通知摘要、通知分类等等。此外,用户可以根据需求进行通知屏蔽或者设定静音时间…

    人工智能概览 2023年5月25日
    00
  • 使用Nodejs连接mongodb数据库的实现代码

    下面为您详细讲解使用Node.js连接MongoDB数据库的实现代码的攻略。 一、安装MongoDB Node.js驱动程序 在使用Node.js连接MongoDB数据库之前,我们需要先安装MongoDB Node.js驱动程序。我们可以通过命令行打开Node.js环境,执行以下命令来安装: npm install mongodb 二、建立数据库连接 在使用…

    人工智能概论 2023年5月25日
    00
  • dpn网络的pytorch实现方式

    下面是关于“dpn网络的pytorch实现方式”的完整攻略: DPN网络简介 DPN(Dual Path Network)网络是一种深度卷积神经网络。与传统的卷积神经网络不同,DPN网络引入了双向路径机制,以提高网络的性能和稳定性。其核心思想是将特征图分成两个路径,分别进行特征提取和特征融合。 DPN网络的pytorch实现方式 下面是DPN网络的pytor…

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部