JavaScript 浅谈观察者模式 前端设计模式
2、观察者模式
2.1、观察者模式
2.1.1、前言
定义一种一对多的依赖关系,当一个对象发生变化时,所有依赖于它的对象都会自动收到通知并更新。
两个角色:
- Subject(主题/被观察者)
- Observer(观察者)
观察者模式一般至少有一个 Subject(主题) ,可以有多个Observer(观察者)。
二者关系: Subject(主题)主动建立与观察者的关系。
Subject(主题/被观察者):至少要有三个方法——添加观察者、移除观察者、通知观察者。
2.1.2、代码
<input type="text" id="app" oninput="handleInput(event)">
<script>// 主题,接收状态变化,并通知每个观察者class Subject {constructor() {this.observers = []}// 新增观察者addObserver(observer) {this.observers.push(observer)}// 通知每个观察者notify(state) {this.observers.forEach(observer => {observer.update(state)})}removeObserver(observer) {const index = this.observers.indexOf(observer);if (index !== -1) {this.observers.splice(index, 1);}}}// 观察者,等待被通知class Observe {constructor(name) {this.name = name}update(state) {console.log(`${this.name} 获取到最新值:${state}`);}}const handleInput = (e) => {const event = e || eventconst value = event.target.value// 实例化一个主题const sub = new Subject()// 实例化两个观察者 一个沐歌,一个沐夏const muge = new Observe('沐歌')const muxi = new Observe('沐夏')// 添加观察者实例sub.addObserver(muge)sub.addObserver(muxia)// 状态改变,通知所有观察者sub.notify(value)}</script>
2.2、发布订阅模式
2.2.1、前言
发布订阅模式在观察者模式的基础上加入了 事件调度中心 ,提供更灵活的控制,适用于复杂的消息交互场景。
观察者模式是经典的设计模式,观察者和目标之间直接交互,适合简单的一对多通知。
2.2.1、代码
/** @Author: muge* @Date: 2021-05-21 18:46:09* @LastEditors: Please set LastEditors* @LastEditTime: 2023-03-09 16:37:47*/
//仿vue-$on $emit
class Event {// 首先定义一个事件对象,用来装事件数组(多个订阅者)handlers = {};// 订阅(事件添加方法) type=事件名 callback=回调函数$on(type, callback) {if (!this.handlers[type]) {// 没有则初始化this.handlers[type] = [];}// 存入该事件this.handlers[type].push(callback);}// 触发事件 type=事件名 params=参数$emit(type, params) {// 若没有注册该事件则抛出错误if (!this.handlers[type]) return new Error("未注册该事件");// 事件触发this.handlers[type].forEach((callback) => callback(params));}// 取消订阅 type=事件名 callback=回调函数$unsubscribe(type, callback) {// 无效事件抛出异常if (!this.handlers[type]) return new Error("未注册该事件");// 执行回调callback&&callback()// 删除事件delete this.handlers[type];}
}
// 创建一个event实例
const sub = new Event();
// 订阅事件changeInputValue onLaod
sub.$on("changeInputValue", (params) => {console.log("params", params);
});
sub.$on("onLaod", (params) => {console.log("params", params);});
console.log('当前的事件列表',sub.handlers);
// 事件触发
sub.$emit("changeInputValue", "最新的值是:1");
sub.$unsubscribe('changeInputValue',()=>{console.log('取消订阅,执行的回调');
})
console.log('changeInputValue-事件取消',sub.handlers);
DOM事件也是发布订阅模式。订阅window的onload事件,当window加载完毕时会向订阅者发布消息,执行相应的回调函数。
window.addEventListener('onload', function () {console.log('loaded!')
})相关文章:
JavaScript 浅谈观察者模式 前端设计模式
2、观察者模式 2.1、观察者模式 2.1.1、前言 定义一种一对多的依赖关系,当一个对象发生变化时,所有依赖于它的对象都会自动收到通知并更新。 两个角色: Subject(主题/被观察者) Observer(观察者&…...
【自动驾驶】自定义消息格式的话题通信(C++版本)
目录 新建消息文件更改包xml文件中的依赖关系更改cmakelist文件中的配置执行时依赖改变cmakelist编译顺序发布者程序调用者程序新建launch文件程序测试 新建消息文件 在功能包目录下,新建msg文件夹,下面新建mymsg.msg文件,其内容为 string …...
提升前端性能的JavaScript技巧
1. 前端JavaScript性能问题 前端JavaScript的性能问题可以显著影响Web应用的用户体验和整体性能。以下是一些常见的前端JavaScript性能问题: 1.1. 频繁的DOM操作 问题描述:JavaScript经常需要与DOM(文档对象模型)交互来更新页面内容。然而,每次DOM操作都可能触发浏览器的…...
“服务之巅:Spring Cloud中SLA监控与管理的艺术“
标题:“服务之巅:Spring Cloud中SLA监控与管理的艺术” 在微服务架构中,服务调用的可靠性和性能是至关重要的。服务级别协议(Service Level Agreement,简称SLA)是衡量服务性能的关键指标,它定义…...
ChatGPT角色定位提问提示词和指令完整版
角色定位提问 在与ChatGPT的对话中,角色定位提问是一种有效的策略,通过为ChatGPT和自己设定特定的角色或身份,可以引导对话朝着更加具体、有针对性的方向发展。这种提问方式不仅有助于ChatGPT更好地理解问题的背景和需求,还能使回…...
docker之我不会的命令
docker命令之我不会的 保存镜像(打包) docker save 镜像名或镜像id -o 保存路径和镜像名字例子: docker save tomcat -o /home/my_tomcat.tar加载保存的镜像 docker load -i 镜像保存的位置例子 在/home/路径下 docker load -i my_tomca…...
Together规则引擎 金融解决方案
目录 1.金融法规和期望正在发生变化,快速跟踪您的金融数字化变革!2.抵押贷款功能集(MFS)3.MFS 示例模型4.MFS 知识特点5.MFS特定功能 1.金融法规和期望正在发生变化,快速跟踪您的金融数字化变革! ogether规则引擎使金融机构能够简…...
【PyQt5】PyQt5 主要类
1.经常使用的模块 Sr.No.模块描述1QtCore其他模块使用的核心非GUI类2QtGui图形用户界面组件3QtMultimedia低级多媒体编程的类4QtNetwork网络编程的类5QtOpenGLOpenGL支持类6QtScript用于评估Qt脚本的类7QtSql使用SQL进行数据库集成的类8QtSvg用于显示SVG文件内容的类9QtWebKit…...
渗透测试实战-HFS远程RCE漏洞利用
免责声明:文章来源于真实渗透测试,已获得授权,且关键信息已经打码处理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本…...
企业级管理系统模板 -- 若依
文章目录 前言一、若依模板运行效果二、若依模板下载地址 1、版本说明2、前端下载地址3、后端下载地址三、修改模板代码名称四、修改前端标题及logo总结 前言 在我们学习别人的项目时,总会遇到许多不同的管理系统,例如:学生管理系统…...
无人车搭载无人机技术详解
无人车搭载无人机技术,是近年来智能交通与无人机技术深度融合的产物,旨在通过集成两者的优势,实现更加灵活、高效的作业能力。该技术将无人机作为无人车的一个可移动、多功能的传感器平台或执行器,通过协同工作,扩展无…...
从“抠图”到“抠视频”,Meta上新AI工具SAM 2。
继2023年4月首次推出SAM,实现对图像的精准分割后,Meta于北京时间2024年7月30日推出了能够分割视频的新模型SAM 2(Segment Anything Model 2)。SAM 2将图像分割和视频分割功能整合到一个模型中。所谓“分割”,是指区别视…...
一篇讲清楚什么是密码加密和加盐算法 | 附Java代码实现
目录 前言: 一、密码加密 1. MD5介绍 2.彩虹表攻击 3.测试复杂密码是否能被攻破 二、加盐算法 1.对密码123456演示加盐算法 2.盐值的储存 3.密码加盐思想总结 三、Java代码实现 前言: 早些年,数据泄露屡见不鲜,每个班上总…...
C++入门2
函数重载 函数重载:是函数的一种特殊情况,C允许在同一作用域中声明几个功能类似的同名函数,这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型 不同的问题 比如下面的 int add(int x…...
在Nestjs使用mysql和typeorm
1. 创建项目 nest new nest-mysql-test 2. 添加config 安装 nestjs/config 包 pnpm i --save nestjs/config 添加 .env 文件 DATABASE_HOSTlocalhost DATABASE_PORT3306 DATABASE_USERNAMEroot DATABASE_PASSWORD123456 DATABASE_DBdbtest 创建 config/database.config.…...
【数据库】MySql深度分页SQL查询优化
问题描述 mysql中,使用limitoffset实现分页难免会遇到深度分页问题,即页码数越大,性能越差。 select * from student order by id limit 200000,10;如上语句,其实我们希望查询第20000页的10条数据,实际执行会发现耗时…...
黑马Java零基础视频教程精华部分_14_正则表达式
系列文章目录 文章目录 系列文章目录一、先爽一下正则表达式不使用正则的情况下使用正则的情况下 二、正则表达式的作用三、正则表达式具体表达1、规则2、字符类示例3、预定义字符示例首先学习转义字符 示例练习 四、基本练习1、快捷方法:2、验证手机号3、验证座机电…...
20240812 每日AI必读资讯
黑匣子被打开了!能玩的Transformer可视化解释工具:Transformer Explainer - 佐治亚理工学院和 IBM 研究院开发一款基于 web 的开源交互式可视化工具「Transformer Explainer」,帮助非专业人士了解 Transformer 的高级模型结构和低级数学运算…...
C++ 项目中的类框架
/* * 类调用框架 */ /* CameraApp.h */ class CameraApp { public: CameraApp(); ~CameraApp(); int Init(void); int UnInit(void); public: XnetNode m_xnode_thd; XcamServer m_xcam_thd; }; /* CameraApp.cpp */ CameraApp::CameraApp(): m_…...
【Python随笔】比PyQt5更先进的pyside6安装和使用方法
最近因为自研日常开发工具的需求,决定重新拾起PyQt5之类的桌面工具开发技术栈,为啥选用PyQt,一是因为笔者比较精通python,二是因为不需要在外观上做什么特别的东西。经过一番调研,发现当前的PyQt5版本已经过时…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
