JavaScript观察者模式(经典)

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日

相关文章

  • 总结Node.js中的一些错误类型

    下面是关于总结Node.js中的一些错误类型的完整攻略: 错误类型 在Node.js使用过程中,我们会遇到多种错误类型,下面是一些常见的错误类型。 SyntaxError SyntaxError 是在JavaScript代码解析过程中发现的语法错误。通常,这种错误是因为代码中有一个或多个拼写错误或语法错误导致的。例如: if (mood === "…

    JavaScript 2023年5月28日
    00
  • javascript数组对象常用api函数小结(连接,插入,删除,反转,排序等)

    下面我来为你详细讲解“javascript数组对象常用api函数小结(连接,插入,删除,反转,排序等)”的攻略。 JavaScript数组对象常用api函数小结 连接数组 concat:连接两个或多个数组,返回新的数组对象。 示例: const arr1 = [‘a’, ‘b’]; const arr2 = [‘c’]; const arr3 = [‘d’,…

    JavaScript 2023年5月27日
    00
  • 浅谈JavaScript中的字符编码转换问题

    浅谈JavaScript中的字符编码转换问题 什么是字符编码? 在计算机中,字符的内部表示是使用数字来表示的。我们所看到的文字、符号等内容在计算机中都需要通过数字编码来表达。因此,字符编码就是一种将字符映射为数字的方式。 常用的字符编码有ASCII、Unicode、UTF-8等。 JavaScript中的字符编码 在JavaScript中处理字符编码主要涉及…

    JavaScript 2023年5月20日
    00
  • 微信小程序实战之自定义模态弹窗(8)

    关于“微信小程序实战之自定义模态弹窗(8)”,我将从以下几个方面进行详细讲解: 创建自定义模态弹窗组件 在需要使用的页面中引入自定义组件 调用自定义组件并传递参数 示例说明 1. 创建自定义模态弹窗组件 创建自定义组件有两种方式,一种是使用 wepy 进行开发,另一种是使用 原生 小程序开发方式。下面是使用 原生 小程序开发方式创建自定义模态弹窗组件: 首先…

    JavaScript 2023年6月11日
    00
  • JavaScript中颜色模型的基础知识与应用详解

    JavaScript中颜色模型的基础知识与应用详解 一、颜色模型基础知识 1. RGB 颜色模型 RGB是一种颜色模型,RGB分别代表红色、绿色、蓝色三个颜色通道。在 RGB 颜色模型中,每个颜色通道的取值范围在 0-255 之间。可以通过拼接不同的 RGB 值来得到不同的颜色,如 rgb(255, 0, 0) 表示红色。 在 JavaScript 中,可以…

    JavaScript 2023年5月28日
    00
  • 简单实现ajax获取跨域数据

    实现ajax跨域获取数据在Web开发中非常常见,由于浏览器的同源策略,直接在页面中通过ajax获取跨域数据是不允许的,但是我们可以通过JSONP和CORS两种方式来实现跨域数据获取。 JSONP JSONP(JSON with Padding)是一种基于JSON的数据交互方式,它允许我们通过在页面上动态创建标签的方式来实现跨域数据获取。JSONP的原理是利用…

    JavaScript 2023年6月11日
    00
  • JavaScript自定义事件介绍

    以下是JavaScript自定义事件的详细介绍: 什么是JavaScript自定义事件? 在JavaScript中,自定义事件是指可以自定义触发和监听的事件,以便根据需要执行某些操作。 如何定义自定义事件? 我们可以使用原生JavaScript或者第三方库(例如jQuery)来定义自定义事件。以下是几种定义自定义事件的方式: 1. 使用Event对象 con…

    JavaScript 2023年6月10日
    00
  • 16个最流行的JavaScript框架[推荐]

    16个最流行的JavaScript框架[推荐]攻略 介绍 JavaScript框架可以帮助开发者更加高效地创建Web应用程序。在这篇攻略中,我们将介绍16个最流行的JavaScript框架,这些框架功能各异,可以满足不同开发需求。在选择JavaScript框架时,我们建议开发者先考虑项目的需求和特点。以下是我们推荐的16个JavaScript框架: Angu…

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