js设计模式--观察者模式

news/2024/10/22 10:51:19/

概述

观察者模式用于在对象之间建立 一对多 的依赖关系,当一个对象状态发生变化时,它的所有依赖者(观察者)都会收到通知并自动更新。在js中,观察者模式通常由两个角色组成:主体(Subject)和观察者(Observer)。主体维护一个观察者列表,并提供添加、删除和通知观察者的方法。观察者则实现一个更新方法,用于接收主体的通知并执行相应的操作。

通过使用观察者模式,可以 实现松耦合 的代码架构,使得主体和观察者彼此独立,易于扩展和维护。在js中,观察者模式广泛应用于事件处理、异步编程和React等框架中。

使用场景

观察者模式通常用于对象间的一对多依赖关系,当一个对象的状态发生变化时,它会自动通知所有依赖它的对象,让它们进行相应的更新操作。这种模式适用于以下场景:

  1. 当一个对象的改变需要同时改变其他对象的时候。
  2. 当一个对象需要将自己的改变通知其他对象而又不希望与这些对象形成紧耦合关系的时候。
  3. 当一个对象和其他对象之间存在很多依赖关系,而这些依赖关系又是可变的时候。

代码示例

实现观察者模式,可以通过以下步骤:

  1. 创建一个被观察者(Subject)对象,它包含一个观察者(Observer)列表和一些方法来添加、删除和通知观察者。
  2. 创建一个观察者对象,它包含一个 update 方法,用于接收来自被观察者的通知。
  3. 创建一个被观察者实例和多个观察者实例,并将观察者添加到被观察者的观察者列表中。
  4. 调用被观察者的 notifyObservers 方法,通知所有观察者更新。

这样,当被观察者的状态发生改变时,就会通知所有观察者,让它们能够及时更新自己的状态。

// 1.
class Subject {constructor() {this.observers = [];}addObserver(observer) {this.observers.push(observer);}removeObserver(observer) {const index = this.observers.indexOf(observer);if (index !== -1) {this.observers.splice(index, 1);}}notifyObservers(data) {for (const observer of this.observers) {observer.update(data);}}
}// 2.
class Observer {constructor() {}update(data) {console.log(`Received data:${data}`);}
}// 3.
const subject = new Subject();
const observer1 = new Observer();
const observer2 = new Observer();subject.addObserver(observer1);
subject.addObserver(observer2);// 4.
subject.notifyObservers(JSON.stringify({ message: 'Hello' }));

http://www.ppmy.cn/news/1459478.html

相关文章

MFC中关于CMutex类的学习

MFC中关于CMutex类的学习 最近在项目中要实现两个线程之间的同步,MFC中提供了4个类,分别是CMutex(互斥量)、CCriticalSection(临界区)、CEvent(事件对象)、CSemaphore(信号量)。有关这4个类的说明,大家可以参考微软官方文档: CM…

富格林:正规经验加持交易安全

富格林指出,现货黄金是一种特殊的黄金交易形式,作为最热门的黄金投资受到大家欢迎,进行现货黄金交易需要掌握现货黄金分析技巧和方法,更重要的是要有正规交易经验的加持。现货黄金的安全性大家可以说是毋容置疑的,但也…

UE5材质基础(3)——数学节点篇2

UE5材质基础(3)——数学节点篇2 目录 UE5材质基础(3)——数学节点篇2 承接上文Time和lerp配合使用 Floor节点 Ceil节点 Frac节点 Fmod节点 TexCoord节点 If节点 Fresnel节点 CameraPosition节点 CameraVector节点 Pi…

【Node.js从基础到高级运用】二十八、Node.js 内存管理浅析

Node.js 作为一个基于 Chrome V8 引擎的 JavaScript 运行环境,其性能和效率在很大程度上取决于内存管理的优劣。 1. Node.js 内存结构 在深入了解内存管理之前,我们需要先了解 Node.js 的内存结构。Node.js 的内存可以大致分为以下几个部分:…

企业微信创建应用(一)

登录到企业微信后台管理(https://work.weixin.qq.com/)进入自建应用(应用管理-应用-创建应用) 3.查看参数AgentId和 Secret 4.企业微信查看效果

记录一个git无法push的问题

今天准备写新功能,想把之前的代码push到远程仓库,但是git突然就不工作了,报错如下 OpenSSL SSL_connect: Connection was reset in connection to gitee.com:443 因为我昨天把项目目录改了,以为是目录修改的问题,但是…

【全开源】JAVA台球助教台球教练多端系统源码支持微信小程序+微信公众号+H5+APP

功能介绍 球厅端:球厅认证、教练人数、教练的位置记录、助教申请、我的项目、签到记录、我的钱包、数据统计 教练端:我的页面,数据统计、订单详情、保证金、实名认证、服务管理、紧急求助、签到功能 用户端:精准分类、我的助教…

STM32程序进入hardfault_handler()

背景: 假期前一直在修改代码,没有边改边测。节后回来测试代码,发现程序上电后很快就进入hardfault_handler()中断。 导致程序反复复位。 查找原因: 在程序的_it.c文件里有几句代码,如果注释…