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版本已经过时…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...