JavaScript观察者模式(经典)

yizhihongxing

JavaScript观察者模式是一种常见的软件设计模式,被广泛应用于JavaScript代码中。其核心思想是,当某个对象(主题对象)发生变化时,能够通知订阅了它的观察者对象,并且观察者对象能够得到主题对象的变化信息并进行相应的处理。

简单来说,观察者模式可以使多个对象之间产生松耦合关系,让代码具备更好的可维护性和可扩展性。

以下是详细的攻略:

观察者模式的基本概念

在观察者模式中,主题对象负责维护一组观察者对象,并在自身发生变化时通知这些观察者对象。

具体来说,主题对象应该具备以下几个基本方法:

  • attach(observer):向主题对象添加一个观察者对象。
  • detach(observer):从主题对象中移除一个观察者对象。
  • notify():通知所有已注册的观察者对象。

观察者对象应该具备以下一个方法:

  • update(subject, args):在主题对象发生变化时被调用,传入的参数包括主题对象本身以及额外的变化信息。

基本实现方式

观察者模式的实现方式可以有多种,以下是一种经典的基本实现方式:

// 定义主题对象
class Subject {
  constructor() {
    this.observers = [];
  }

  attach(observer) {
    this.observers.push(observer);
  }

  detach(observer) {
    const idx = this.observers.indexOf(observer);
    if (idx >= 0) {
      this.observers.splice(idx, 1);
    }
  }

  notify(args) {
    for (const observer of this.observers) {
      observer.update(this, args);
    }
  }
}

// 定义观察者对象
class Observer {
  update(subject, args) {
    // 处理主题对象变化的逻辑
  }
}

// 示例代码
const subject = new Subject();
const observer1 = new Observer();
const observer2 = new Observer();

subject.attach(observer1);
subject.attach(observer2);

subject.notify('something happened'); // 通知所有的观察者

在上面的示例中,我们定义了一个主题对象和一个观察者对象,并用 attachdetach 方法来注册和移除观察者对象,在 notify 方法中通知所有已注册的观察者对象。

同时,观察者对象通过 update 方法来处理主题对象的变化。在 update 方法中,我们可以获取主题对象本身以及额外的变化信息,完成相应的处理。

观察者模式的其他实现方式

除上述经典实现方式外,还有以下几种常见的观察者模式的实现方式:

  • 利用回调函数:在主题对象中定义回调函数,在变化发生后直接调用回调函数通知观察者,比较简单易懂。
  • 利用发布/订阅模式:将观察者对象和主题对象解耦,让主题对象成为一个事件发射器(发布者),观察者对象作为事件监听器(订阅者),通过事件订阅和发布机制来实现通信。

示例代码

以下是一个基于回调函数的观察者模式的示例代码:

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

  registerCallback(callback) {
    this.callbacks.push(callback);
  }

  unregisterCallback(callback) {
    const idx = this.callbacks.indexOf(callback);
    if (idx >= 0) {
      this.callbacks.splice(idx, 1);
    }
  }

  update(args) {
    for (const callback of this.callbacks) {
      callback(args);
    }
  }
}

class Observer {
  constructor() {
    this.id = Math.random();
  }

  handleUpdate(args) {
    console.log(`Observer ${this.id} received update: ${args}`);
  }
}

const subject = new Subject();
const observer1 = new Observer();
const observer2 = new Observer();

subject.registerCallback(observer1.handleUpdate.bind(observer1));
subject.registerCallback(observer2.handleUpdate.bind(observer2));

subject.update('something happened'); // 通知所有注册的回调函数

在上面的示例中,我们用回调函数的方式实现了观察者模式。主题对象维护一个回调函数列表,观察者对象注册自己的回调函数,主题对象在变化发生后直接调用所有已注册的回调函数。观察者对象通过回调函数来处理主题对象的变化。

另外,我们可以通过利用闭包来简化上述示例代码中 bind 的操作,具体实现方法可以参考相关教程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript观察者模式(经典) - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 微前端qiankun沙箱实现源码解读

    我们来详细讲解一下“微前端qiankun沙箱实现源码解读”的完整攻略。 什么是微前端 首先,我们需要知道什么是微前端。简单地说,微前端是一种前端架构模式,它将大型Web应用程序分解为较小的、易于管理的模块,这些模块可以独立地开发、测试和部署。每个模块可以由不同的团队开发,并且可以以不同的速度进行更新和发布。这种模式使得公司可以更加灵活地开发和部署前端应用程序…

    JavaScript 2023年6月11日
    00
  • Easyui form combobox省市区三级联动

    Easyui form combobox省市区三级联动可以帮助用户快速选择省市区的信息,提供了良好的用户体验。下面我们来详细讲解该功能的完整攻略。 实现步骤 第一步:引入EasyUI资源文件和jQuery库文件 <link rel="stylesheet" type="text/css" href="h…

    JavaScript 2023年6月11日
    00
  • JS运动特效之完美运动框架实例分析

    下面是详细讲解完美运动框架实例分析的攻略: JS运动特效之完美运动框架实例分析 一、简介 完美运动框架是一款优秀的JS运动特效库,可以实现多种运动效果,如匀速运动、缓冲运动等等。本篇文章将从实例分析的角度出发,介绍完美运动框架的常规用法以及一些细节问题。 二、常规用法 1. 引入完美运动框架 完美运动框架是一个单独的JS文件,需要在HTML文件中引入才能使用…

    JavaScript 2023年6月11日
    00
  • JavaScript学习小结(一)——JavaScript入门基础

    JavaScript学习小结(一)——JavaScript入门基础 JavaScript是一种用于Web开发的脚本语言,主要用于增强网页的交互性和动态性。本篇文章将为初学者介绍JavaScript的入门基础。 语法结构 JavaScript代码通常嵌入在HTML文件中,可以使用<script>标签来定义JS代码块。JavaScript的语法结构包…

    JavaScript 2023年5月17日
    00
  • 深入理解javascript的执行顺序

    深入理解JavaScript的执行顺序是编写优秀JavaScript代码的基础。JavaScript的执行顺序遵循一定的规则,理解这些规则可以帮助我们理解代码的执行顺序,避免出现错误。 1. 执行栈 在深入了解JavaScript的执行顺序之前,我们需要了解执行栈的概念。执行栈是一个存储函数调用的栈结构,当JavaScript代码执行的时候,函数调用会被依次…

    JavaScript 2023年5月18日
    00
  • JavaScript原型对象、构造函数和实例对象功能与用法详解

    JavaScript原型对象、构造函数和实例对象功能与用法详解 前言 在讲解 JavaScript 原型对象、构造函数和实例对象之前,我们需要先了解几个概念: 属性:包括原型对象和实例对象的属性,以及函数对象的属性 方法:包括原型对象和实例对象的方法,以及函数对象的方法 原型:每个 JavaScript 对象都有一个原型对象,用于继承属性和方法 构造函数:用…

    JavaScript 2023年5月27日
    00
  • JS对字符串编码的几种方式使用指南

    JS对字符串编码的几种方式使用指南 在前端开发中,我们经常需要处理字符串编码的相关问题,如将字符串进行编码、解码等。本文将介绍JS中对于字符串编码的几种方式以及它们的使用方法,同时提供相应的示例。 Unicode编码 Unicode编码是一种用于表示各种字符的标准,它规定了字符集、编码方式、具体字符的表示方法等,是目前最常用的字符编码标准之一。在JS中,我们…

    JavaScript 2023年5月20日
    00
  • 深入理解Jquery表单验证(使用formValidator)

    深入理解JQuery表单验证(使用formValidator) 简介 JQuery表单验证是前端开发中经常使用到的技术之一,它可以对用户输入的表单数据进行自定义的验证。本篇文章将介绍如何使用 JQuery 插件 formValidator 进行表单验证。 安装 首先需要在项目中引入 JQuery 和 formValidator。 <head> &…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部