新闻中心
J*aScript观察者模式与发布订阅
观察者模式中目标对象直接通知观察者,两者存在耦合;发布订阅模式通过事件中心解耦,发布者与订阅者无直接依赖。前者适用于简单通信,后者更适合复杂系统的松耦合设计。

观察者模式和发布订阅模式听起来很像,但在 J*aScript 中它们有本质区别。很多人容易混淆这两个概念,其实理解清楚对构建解耦的前端架构很有帮助。
观察者模式:对象间的直接依赖
观察者模式中,一个目标对象(Subject)维护一组观察者(Observer),当目标状态发生变化时,会主动通知所有观察者执行更新。
特点在于:观察者和被观察者是**直接绑定**的,两者存在耦合。
例子:- 有一个数据模型作为 Subject
- 多个视图组件作为 Observer
- 数据变化时,调用每个观察者的 update 方法
实现简单,适合模块内部通信。
代码示意:
class Subject {
constructor() {
this.observers = [];
}
addObserver(observer) {
this.observers.push(observer);
}
notify() {
this.observers.forEach(observer => observer.update());
}
}
class Observer {
update() {
console.log('收到更新');
}
}
发布订阅模式:通过事件中心解耦
发布订阅模式引入了一个中间角色——事件总线(Event Bus)或调度中心。发布者和订阅者不直接通信,而是通过事件通道传递消息。
小团团购系统
#.小团团购系统是一套groupon模式的团购程序。#.小团团购系统支持一般团购系统的发布团购、团购分类、团购城市设置、团购地图显示、购物车功能、团购统计、团购数量与打折设置等功能;#.此外,小团系统里还包括了系统设置、用户管理、用户等级、用户类型设置、用户自助支付、用户认证等功能;#.同时,还以扩展模块的方式完善集成了最新活动订阅、团购问答、团购论坛、和一些个人应该功能扩展了团购系统,以便增加团
0
查看详情
核心优势是**完全解耦**:发布者不需要知道谁订阅了,订阅者也不关心谁发布的。
典型场景:- 跨组件通信(如 Vue 的 EventBus)
- 模块间松耦合协作
- 异步事件处理(如用户登录、页面加载完成)
代码示意:
class EventEmitter {
constructor() {
this.events = {};
}
on(event, callback) {
if (!this.events[event]) {
this.events[event] = [];
}
this.events[event].push(callback);
}
emit(event, data) {
if (this.events[event]) {
this.events[event].forEach(callback => callback(data));
}
}
}
关键区别总结
虽然两种模式都实现了“一对多”的通知机制,但结构不同:
- 观察者模式:Subject 直接管理 Observer,属于设计模式中的行为型模式,耦合度高
- 发布订阅模式:通过事件中心转发消息,更灵活,常用于实现消息队列、事件系统
可以理解为:发布订阅是观察者模式的“升级版”,加了一层中介,更适合复杂应用。
基本上就这些。实际开发中,Vue 的 $emit/$on、Node.js 的 EventEmitter 都是发布订阅的应用。选择哪种,取决于你是否需要解耦和扩展性。
以上就是J*aScript观察者模式与发布订阅的详细内容,更多请关注其它相关文章!
# 两种
# 中山品牌网站seo优化
# 福州seo推广优化培训
# 泰州专业站seo优化
# seo检测优化工具
# 淘宝推广营销的工具
# 微信网站建设建站系统
# 成都关键词seo排名
# 探案网站推广
# 诸暨网络推广营销公司
# 景洪网站关键词优化
# 但在
# 很有
# 很多人
# vue
# 多个
# 都是
# 复用
# 更适合
# 等功能
# 团购
# 区别
# node
# node.js
# 前端
# js
# java
# javascript
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
如何创建独立于主系统的J*a运行环境_隔离式环境搭建策略
支付宝如何管理隐私设置_支付宝隐私保护的配置技巧
小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口
Go语言中Map存储的结构体如何调用指针方法:深入解析与实践
在J*a中如何使用Stream.map转换元素_Stream映射操作解析
使用Pandas转换并合并DataFrame:多列映射至统一结构
C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法
58动漫网在线官方网 58动漫网正版动漫入口网址
在命令行怎么运行html项目_命令行运行html项目方法【教程】
如何在Promise链中有效终止错误处理后的执行
一加Ace 6T实拍样张首次公布!李杰:主摄实力完全看齐4K档性能旗舰
知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法
在J*a中如何开发简易博客标签推荐系统_博客标签推荐项目实战解析
12306选座如何查看座位示意图_12306座位示意图解读与使用
抓大鹅无需下载版 抓大鹅秒玩版入口
照顾宝贝2小游戏点击立即在线玩
LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别
解决 Express.js 中 PUT 请求密码修改失败的路由配置指南
C++ map遍历方法大全_C++ map迭代器使用总结
漫蛙网页登录入口 漫蛙漫画官方授权网址
韩剧圈正版入口页面_韩剧圈官网登录链接
蛙漫正版漫画平台入口_蛙漫免费阅读全站漫画资源
高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法
Win11怎么修改默认浏览器_Windows 11设置Chrome为默认
QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道
微信商城在哪里打开【步骤】
LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理
Win10双系统截图高效法 截屏快捷键速记【技巧】
QQ邮箱在线使用入口 QQ邮箱个人账号网页版登录
Win10磁盘清理工具在哪 Win10打开并使用磁盘清理【教程】
怎么在浏览器上运行HTML文件_浏览器运行HTML文件技巧【技巧】
Python Socket多播通信中指定源IP地址的实践指南
荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程
在React函数组件中利用原生HTML5进行邮箱地址验证
Win11蓝牙耳机断连怎么解决 Win11蓝牙设置重新配对与驱动更新【技巧】
J*aScript map 方法中处理循环元素为空数组的策略
UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS
J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题
Win11怎么隐藏桌面图标 Win11一键隐藏所有桌面元素及恢复显示
Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧
c++ dfs和bfs代码 c++深度广度优先搜索算法
一加手机拍照效果不好怎么办 一加哈苏影像调校与专业模式使用教程【高手篇】
Win11输入法不见了怎么办_Windows11恢复语言栏显示方法
KFC早餐时段怎么领特惠代码_KFC早餐订餐优惠代码获取与使用说明
可靠CSGO开箱平台解析 CSGO开箱网合集
C++如何生成随机数_C++ random库使用方法与范围设置
Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】
QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台
Python多版本共存与虚拟环境管理深度指南
C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言


2025-11-14
浏览次数:次
返回列表
布订阅模式通过事件中心解耦,发布者与订阅者无直接依赖。前者适用于简单通信,后者更适合复杂系统的松耦合设计。