0

0

JavaScript中什么是设计模式_观察者模式实现

夜晨

夜晨

发布时间:2025-12-21 19:32:02

|

556人浏览过

|

来源于php中文网

原创

观察者模式定义对象间一对多依赖关系,当被观察者状态改变时自动通知所有观察者更新;核心角色为subject(维护观察者列表并通知)和observer(实现update接口响应通知)。

javascript中什么是设计模式_观察者模式实现

观察者模式(Observer Pattern)是 JavaScript 中最常用的行为型设计模式之一,核心思想是:**定义对象间的一对多依赖关系,当一个对象状态改变时,所有依赖它的对象都会自动收到通知并更新**。它特别适合处理事件驱动、数据响应式、状态同步等场景,比如 Vue 的响应式系统、DOM 事件监听、自定义事件总线等底层都离不开它。

观察者模式的核心角色

它包含两个关键角色:

  • Subject(被观察者 / 发布者):维护一组观察者,提供添加、删除、通知观察者的方法;自身状态变化时主动触发通知。
  • Observer(观察者 / 订阅者):定义统一的更新接口(如 update()),在被通知时执行具体逻辑。

手写一个简洁可用的观察者模式

下面是一个轻量、可直接运行的实现,不依赖框架,突出本质逻辑:

class Subject {
  constructor() {
    this.observers = [];
  }

  // 添加观察者
  subscribe(observer) {
    if (typeof observer.update === 'function') {
      this.observers.push(observer);
    }
  }

  // 移除观察者
  unsubscribe(observer) {
    this.observers = this.observers.filter(obs => obs !== observer);
  }

  // 通知所有观察者(可传入数据)
  notify(data) {
    this.observers.forEach(observer => observer.update(data));
  }
}

class Observer {
  constructor(name, callback) {
    this.name = name;
    this.callback = callback;
  }

  update(data) {
    this.callback(data, this.name);
  }
}

// 使用示例
const subject = new Subject();

const obs1 = new Observer('UI组件A', (data, name) => {
  console.log(`${name} 收到:`, data);
});

const obs2 = new Observer('日志服务', (data, name) => {
  console.log(`${name} 记录:`, JSON.stringify(data));
});

subject.subscribe(obs1);
subject.subscribe(obs2);

subject.notify({ status: 'loading', progress: 50 }); 
// 输出:
// UI组件A 收到: { status: 'loading', progress: 50 }
// 日志服务 记录: {"status":"loading","progress":50}

更贴近实际开发的优化版本

真实项目中常需要支持「按事件类型订阅」、「一次性监听」、「取消全部」等功能。可以升级为类似 EventEmitter 的风格:

达奇AI论文写作
达奇AI论文写作

达奇AI论文辅助写作平台,在校学生、职场精英都在用的AI论文辅助写作平台

下载

立即学习Java免费学习笔记(深入)”;

class EventHub {
  constructor() {
    this.events = {};
  }

  on(type, handler) {
    if (!this.events[type]) this.events[type] = [];
    this.events[type].push(handler);
  }

  once(type, handler) {
    const wrapper = (...args) => {
      handler(...args);
      this.off(type, wrapper);
    };
    this.on(type, wrapper);
  }

  emit(type, ...args) {
    const handlers = this.events[type] || [];
    handlers.forEach(fn => fn(...args));
  }

  off(type, handler) {
    if (!this.events[type]) return;
    this.events[type] = this.events[type].filter(fn => fn !== handler);
  }

  clear(type) {
    if (type) delete this.events[type];
    else this.events = {};
  }
}

// 使用
const hub = new EventHub();
hub.on('user-login', user => console.log('欢迎', user.name));
hub.emit('user-login', { name: '张三' });

和发布-订阅模式的区别(常见误区)

很多人把观察者模式和发布-订阅(Pub/Sub)混为一谈,其实关键区别在于:是否有中间调度中心

  • 观察者模式中,Subject 和 Observer 是直接关联的(松耦合但有引用);
  • 发布-订阅模式引入了第三方事件总线(Event Bus),发布者和订阅者完全解耦,互不知晓对方存在。

上面的 EventHub 就是典型的发布-订阅实现 —— 它更灵活,更适合大型应用模块通信;而基础 Subject/Observer 更适合小范围、强语义的状态联动(如一个 Model 和多个 View)。

基本上就这些。观察者模式不复杂,但容易忽略“解耦时机”和“内存泄漏”问题(比如忘了 unsubscribe)。用好它,能让代码更清晰、响应更及时。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1735

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

569

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2338

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

43

2026.01.19

DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

4106

2024.08.14

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

46

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

42

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

37

2026.02.28

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

21

2026.02.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Vue 教程
Vue 教程

共42课时 | 9.1万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号