理解JavaScript 的发布者_订阅者模式

简介: 理解JavaScript 的发布者_订阅者模式

原文合集地址如下,有需要的朋友可以关注

本文地址

合集地址

什么是发布者/订阅者模式

发布者-订阅者模式是一种软件设计模式,用于实现对象之间的一对多依赖关系。在这种模式中,一个对象(被称为发布者)而其他对象(成为订阅者)可以在发布者上注册自己,以接受特定事件或消息的通知。

发布者: 负责维护订阅者列表和发布事件或消息。当某个事件或消息发生时,发布者将通知发送给所有订阅者。
订阅者:注册在发布者上,以接受感兴趣的事件或消息的通知。当发布者发布相应事件时,订阅者相应做出响应。
工作流程:

  1. 发布者维护一个订阅者列表,并提供注册、注销和通知的方法。
  2. 订阅者注册自己到发布者上,表明自己对某个事件或消息感兴趣。
  3. 当发布者发布相应的事件或消息时,会遍历订阅者列表,将通知发送给所有订阅者。
  4. 订阅者收到通知后,执行相应的处理逻辑。
    优点:
  • 实现了松耦合:发布者和订阅者之间相互独立,可以方便的删除和增加订阅者,而不影响其他代码部分。
  • 提高代码复用性:多个订阅者可以共享同一个发布者,在这里插入代码片从而实现代码的复用。
    应用场景:
  • GUI应用程序中的事件处理机制。
  • 前端框架中的监听和消息通知。
  • JS中的自定义事件。

结合例子理解:

// 发布者 (Publisher/Subject)
class Publisher {
   
  constructor() {
   
    this.subscribers = [];
  }

  // 注册订阅者
  subscribe(subscriber) {
   
    this.subscribers.push(subscriber);
  }

  // 取消订阅
  unsubscribe(subscriber) {
   
    this.subscribers = this.subscribers.filter((sub) => sub !== subscriber);
  }

  // 发布事件通知
  publish(message) {
   
    this.subscribers.forEach((subscriber) => subscriber.receive(message));
  }
}

// 订阅者 (Subscriber/Observer)
class Subscriber {
   
  constructor(name) {
   
    this.name = name;
  }

  // 接收事件通知
  receive(message) {
   
    console.log(`${this.name} received: ${message}`);
  }
}

// 创建发布者实例
const publisher = new Publisher();

// 创建订阅者实例
const subscriberA = new Subscriber('Subscriber A');
const subscriberB = new Subscriber('Subscriber B');

// 订阅者注册到发布者上
publisher.subscribe(subscriberA);
publisher.subscribe(subscriberB);

// 发布者发布事件通知
publisher.publish('Hello World!');

// 取消订阅者A的订阅
publisher.unsubscribe(subscriberA);

// 再次发布事件通知
publisher.publish('How are you?');

在这个例子中,创建了一个简单的发布者类Publisher和一个订阅者类Subscriber。发布者维护一个订阅者列表,并提供subscribe方法用于注册订阅者,unsubscribe用于取消订阅,publish方法用于发布事件通知。
输出结果:

Subscriber A received: Hello World!
Subscriber B received: Hello World!
Subscriber B received: How are you?

在输出结果中,可以看到订阅者A和订阅者B都收到了 "Hello World!" 的事件通知。然后取消了订阅者A的订阅,再次发布事件通知时,
只有订阅者B收到了 "How are you?" 的事件通知。这展示了发布者-订阅者模式的工作机制:多个订阅者可以订阅同一个发布者,
发布者发布事件通知时,所有订阅者都会收到相应的通知。同时,订阅者可以根据自己的需求注册和取消订阅,从而实现灵活的事件处理。

观察者模式

实际上,发布者-订阅者模式和观察者模式是同一种模式,只是在不同的文献或资料中可能称呼不同。

在发布者-订阅者模式中,有一个调用中心(或者称为发布者或主题),它负责维护订阅者列表和发布事件或消息。
其他对象(订阅者或观察者)可以注册自己到调用中心,以接收特定事件或消息的通知。
需要注意的是,虽然两种模式的概念相似,但在具体实现上可能有一些差异。
不同的开发框架或库可能有不同的实现方式,但总体的思想和目标都是相同的。选择使用哪种模式取决于具体的应用场景和需求。
用观察者模式举个例子:

// 被观察者 (Subject)
class Subject {
   
  constructor() {
   
    this.observers = [];
  }

  // 注册观察者
  addObserver(observer) {
   
    this.observers.push(observer);
  }

  // 注销观察者
  removeObserver(observer) {
   
    this.observers = this.observers.filter((obs) => obs !== observer);
  }

  // 发送通知给所有观察者
  notify(message) {
   
    this.observers.forEach((observer) => observer.update(message));
  }
}

// 观察者 (Observer)
class Observer {
   
  constructor(name) {
   
    this.name = name;
  }

  // 接收通知
  update(message) {
   
    console.log(`${this.name} received: ${message}`);
  }
}

// 创建被观察者实例
const subject = new Subject();

// 创建观察者实例
const observerA = new Observer('Observer A');
const observerB = new Observer('Observer B');

// 观察者注册到被观察者上
subject.addObserver(observerA);
subject.addObserver(observerB);

// 被观察者发送通知
subject.notify('Hello World!');

// 观察者注销
subject.removeObserver(observerA);

// 再次发送通知
subject.notify('How are you?');

输出结果与之前的发布者-订阅者模式相同:

Observer A received: Hello World!
Observer B received: Hello World!
Observer B received: How are you?

总结

在实际开发中,无论是使用观察者模式还是订阅者-发布者模式,它们的基本思想和用法是相同的:一个对象(被观察者或发布者)维护一个观察者列表,其他对象(观察者或订阅者)可以注册自己到这个列表中,以接收特定事件或消息的通知。当事件或消息发生时,被观察者或发布者会遍历观察者列表,将通知发送给所有观察者或订阅者。

目录
相关文章
|
5月前
|
存储 安全 JavaScript
云计算浪潮中的网络安全之舵探索Node.js中的异步编程模式
【8月更文挑战第27天】在数字化时代的风帆下,云计算如同一片广阔的海洋,承载着企业与个人的数据梦想。然而,这片海洋并非总是风平浪静。随着网络攻击的波涛汹涌,如何确保航行的安全成为了每一个船员必须面对的挑战。本文将探索云计算环境下的网络安全策略,从云服务的本质出发,深入信息安全的核心,揭示如何在云海中找到安全的灯塔。
|
26天前
Next.js 实战 (三):优雅的实现暗黑主题模式
这篇文章介绍了在Next.js中实现暗黑模式的具体步骤。首先,需要安装next-themes库。然后,在/components/ThemeProvider/index.tsx文件中新增ThemeProvider组件,并在/app/layout.tsx文件中注入该组件。如果想要加入过渡动画,可以修改代码实现主题切换时的动画效果。最后,需要在需要的位置引入ThemeModeButton组件,实现暗黑模式的切换。
|
2月前
|
前端开发 JavaScript UED
探索JavaScript的异步编程模式
【10月更文挑战第40天】在JavaScript的世界里,异步编程是一道不可或缺的风景线。它允许我们在等待慢速操作(如网络请求)完成时继续执行其他任务,极大地提高了程序的性能和用户体验。本文将深入浅出地探讨Promise、async/await等异步编程技术,通过生动的比喻和实际代码示例,带你领略JavaScript异步编程的魅力所在。
34 1
|
3月前
|
前端开发 JavaScript UED
探索JavaScript中的异步编程模式
【10月更文挑战第21天】在数字时代的浪潮中,JavaScript作为一门动态的、解释型的编程语言,以其卓越的灵活性和强大的功能在Web开发领域扮演着举足轻重的角色。本篇文章旨在深入探讨JavaScript中的异步编程模式,揭示其背后的原理和实践方法。通过分析回调函数、Promise对象以及async/await语法糖等关键技术点,我们将一同揭开JavaScript异步编程的神秘面纱,领略其带来的非阻塞I/O操作的魅力。让我们跟随代码的步伐,开启一场关于时间、性能与用户体验的奇妙之旅。
|
2月前
|
前端开发 JavaScript UED
探索JavaScript的异步编程模式
【10月更文挑战第33天】在JavaScript的世界里,异步编程是提升应用性能和用户体验的关键。本文将带你深入理解异步编程的核心概念,并展示如何在实际开发中运用这些知识来构建更流畅、响应更快的Web应用程序。从回调函数到Promises,再到async/await,我们将一步步解锁JavaScript异步编程的秘密,让你轻松应对各种复杂的异步场景。
|
3月前
|
JavaScript 前端开发 API
探索Node.js中的异步编程模式
【10月更文挑战第4天】在JavaScript的世界中,异步编程是提升应用性能和用户体验的关键。本文将深入探讨Node.js中异步编程的几种模式,包括回调函数、Promises、async/await,并分享如何有效利用这些模式来构建高性能的后端服务。
|
3月前
|
JavaScript 前端开发 调度
探索Node.js中的异步编程模式
在Node.js的世界里,异步编程是核心。本文将带你深入了解异步编程的精髓,通过代码示例和实际案例分析,我们将一起掌握事件循环、回调函数、Promises以及async/await等关键概念。准备好迎接挑战,让你的Node.js应用飞起来!
|
3月前
|
JavaScript 前端开发 开发者
探索Node.js中的异步编程模式
【9月更文挑战第33天】在JavaScript的后端领域,Node.js凭借其非阻塞I/O和事件驱动的特性,成为高性能应用的首选平台。本文将深入浅出地探讨Node.js中异步编程的核心概念、Promise对象、Async/Await语法以及它们如何优化后端开发的效率和性能。
32 7
|
4月前
|
JavaScript 前端开发 开发者
探索Node.js中的异步编程模式
【9月更文挑战第15天】在Node.js的世界中,“一切皆异步”不仅是一句口号,更是其设计哲学的核心。本文将带你深入理解Node.js中异步编程的几种主要模式,包括经典的回调函数、强大的Promise对象、以及简洁的async/await结构。我们将通过实例代码来展示每种模式的使用方式和优缺点,帮助你更好地掌握Node.js异步编程的精髓。无论你是Node.js新手还是有一定经验的开发者,这篇文章都能给你带来新的启示和思考。让我们一起开启Node.js异步编程的探索之旅吧!
|
4月前
|
JavaScript 前端开发 中间件
深入浅出Node.js中间件模式
【9月更文挑战第13天】本文将带你领略Node.js中间件模式的魅力,从概念到实战,一步步揭示如何利用这一强大工具简化和增强你的Web应用。我们将通过实际代码示例,展示中间件如何在不修改原有代码的情况下,为请求处理流程添加功能层。无论你是前端还是后端开发者,这篇文章都将为你打开一扇通往更高效、更可维护代码的大门。