JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解

JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解

什么是观察者模式?

观察者模式也被称为发布订阅模式,是一种软件设计模式,用于将分散在各个部分的通知联系起来以实现松散耦合,降低对象间的依赖性。

在一个典型的观察者模式中,存在两类对象:观察者和被观察者(主题)。被观察者(主题)对象管理所有注册的观察者,并在状态发生变化时主动通知观察者对象。

观察者模式的结构

观察者模式由四个重要的角色组成:

  1. 主题(被观察者)
  2. 观察者
  3. 抽象观察者
  4. 具体观察者

其中,主题对象(Subject)管理一组观察者对象,这组观察者对象形成了这个主题的通知列表,当主题状态变化时,它会自动向它的观察者们发布通知。

JavaScript中的观察者模式

在JavaScript中,我们可以使用面向对象的思想来实现观察者模式。其步骤如下:

  1. 定义一个主题对象(被观察者)
  2. 给主题对象添加存储观察者的列表和一些添加和删除观察者对象的方法
  3. 定义一个观察者对象
  4. 在观察者对象中为主题对象添加观察者
  5. 定义具体观察者对象,并实现通知方式

观察者模式实例1:用户登录验证

以用户登录验证为例,以下是完整示例代码:

主题对象(被观察者)

var LoginSubject = function() {
  this.observers = []; // 存储观察者列表
}

LoginSubject.prototype = {
  add: function(observer) {
    this.observers.push(observer);
  },
  remove: function(observer) {
    this.observers = this.observers.filter(function(item){
      return item !== observer;
    });
  },
  notify: function() {
    this.observers.forEach(function(observer){
      observer.update();
    });
  }
}

我们定义了一个名为LoginSubject的主题对象,其中定义了observers成员变量用于存储观察者列表,并分别定义了addremovenotify方法,分别用于添加观察者、删除观察者和通知所有观察者。

观察者对象

var LoginObserver = function() {};

LoginObserver.prototype = {
  update: function() {
    console.log('用户已登录');
  }
}

定义了一个名为LoginObserver的观察者对象,其中定义了update方法,被主题对象LoginSubject调用时会输出一条“用户已登录”的消息。

具体观察者对象

var LoginSuccessObserver = function() {};

LoginSuccessObserver.prototype = new LoginObserver();

LoginSuccessObserver.prototype.update = function() {
  console.log('登录成功');
}

定义了一个名为LoginSuccessObserver的具体观察者对象,它继承自LoginObserver,并重写了update方法,被主题对象LoginSubject调用时会输出一条“登录成功”的消息。

使用

var loginSubject = new LoginSubject();
var loginSuccessObserver = new LoginSuccessObserver();

loginSubject.add(loginSuccessObserver); // 将具体观察者对象添加到主题对象中
loginSubject.notify(); // 调用通知方法,会输出“登录成功”的消息

最后,我们实例化了LoginSubject对象和LoginSuccessObserver对象,并将观察者对象loginSuccessObserver添加到主题对象中。调用loginSubject.notify()方法,会输出“登录成功”的消息。

观察者模式实例2:商品价格变动

以下是商品价格变动的完整示例代码:

主题对象(被观察者)

var ProductPriceSubject = function() {
  this.observers = []; // 存储观察者列表
  this.price = 0;
}

ProductPriceSubject.prototype = {
  add: function(observer) {
    this.observers.push(observer);
  },
  remove: function(observer) {
    this.observers = this.observers.filter(function(item){
      return item !== observer;
    });
  },
  notify: function() {
    this.observers.forEach(function(observer){
      observer.update();
    });
  },
  setPrice: function(price) {
    this.price = price;
    this.notify(); // 商品价格变动时自动通知观察者们
  },
  getPrice: function() {
    return this.price;
  }
}

定义了一个名为ProductPriceSubject的主题对象,其中定义了observersprice成员变量分别用于存储观察者列表和记录商品价格,并继承了addremovenotify三个方法,即对观察者的添加和删除以及通知观察者的操作。另外,这里定义了setPricegetPrice方法,分别用于设置和获取商品价格,这个主题对象在商品价格变动时会自动通知它的观察者们。

观察者对象

var ProductPriceObserver = function(product) {
  this.product = product;
  this.product.add(this); // 将自己添加到商品价格主题对象中
}

ProductPriceObserver.prototype = {
  update: function() {
    console.log('商品价格变动为:' + this.product.getPrice());
  }
}

定义了一个名为ProductPriceObserver的观察者对象,其构造函数接收一个商品主题对象作为参数,将自己本身添加到主题对象的观察者列表中,并定义update方法,新的价格输出到控制台。

使用

var productPriceSubject = new ProductPriceSubject();
var productPriceObserver1 = new ProductPriceObserver(productPriceSubject);
var productPriceObserver2 = new ProductPriceObserver(productPriceSubject);

productPriceSubject.setPrice(78); // 更新商品价格,会自动通知观察者们

实例化ProductPriceSubject对象以及两个ProductPriceObserver对象,将观察者对象们添加到主题对象中,并调用productPriceSubject.setPrice(78)方法更新商品价格,会自动通知观察者们输出新的价格。

总结

观察者模式是一种实现对象间松散耦合的设计模式,主要由主题对象、观察者和具体观察者对象组成。主题对象管理观察者列表,并在线通知观察者时遍历列表,让观察者执行相应的方法。在JavaScript中,我们可以利用面向对象的思想来简单地实现观察者模式,为实现松耦合的结构提供了简单可行的方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 经典海量jQuery插件 大家可以收藏一下

    首先,使用Markdown格式文本可以以一种结构化的方式,对文本内容进行排版。下面就为大家介绍关于“经典海量jQuery插件”的攻略: 经典海量jQuery插件攻略 什么是jQuery插件? jQuery插件就是根据jQuery框架编写的一组可以用于增强页面功能的JavaScript程序。这些插件的作用就是为了解决前端开发过程中常见的各类问题,例如图像轮播、…

    jquery 2023年5月27日
    00
  • jQWidgets jqxSortable over Event

    首先,需要了解一下jQWidgets jqxSortable的基本概念。 jQWidgets jqxSortable是一个基于jQuery的可拖拽排序插件,支持对HTML元素进行拖拽排序操作和事件处理。其中over事件是在拖拽元素进入被拖拽元素的某个位置时触发的事件。接下来就为大家介绍一下jQWidgets jqxSortable over事件的攻略。 1.…

    jquery 2023年5月11日
    00
  • DataTables lengthChange选项

    以下是关于DataTables lengthChange选项的完整攻略: lengthChange选项是什么? lengthChange选项是DataTables中的一个选项,用于启用或禁用表格每页显示行数的选项。lengthChange选项,可以控制表格每页显示行数的选项是否可见。 如何使用lengthChange选项? 可以使用以下代码lengthCha…

    jquery 2023年5月11日
    00
  • jQuery 3.0中存在问题及解决办法

    jQuery 3.0中存在问题及解决办法 jQuery 3.0是最新版本的jQuery库,但在使用过程中也存在一些问题。本文将介绍这些问题及其解决办法,希望对使用jQuery 3.0的开发者有所帮助。 1. jQuery 3.0中的问题 1.1. 移除了部分API jQuery 3.0在移除部分API方面,比之前版本更加彻底。其中最大的变化是删除了jQuer…

    jquery 2023年5月27日
    00
  • jQWidgets jqxButton imgSrc属性

    jQWidgets jqxButton imgSrc属性详解 jQWidgets是一个基于jQuery的UI组件库,提供了丰富UI组件工具包。jqxButton是其中之一。本文将详细介绍jqxButton的imgSrc属性,包括定义、语法和示例。 imgSrc属性的定义 jqxButton的imgSrc属性用于设置按钮图像的URL。 imgSrc属性的语法 …

    jquery 2023年5月10日
    00
  • JS数组去重的6种方法完整实例

    JS数组去重的6种方法完整实例 为什么要去重 在实际的开发过程中,有时候我们需要对一个数组进行操作,但是这个数组中可能存在重复的元素。这时候就需要对数组进行去重操作,以便得到我们需要的元素或数据。 去重方法 方法一:使用set去重 使用ES6中的Set数据结构可以非常方便地对一个数组进行去重操作。 const arr = [1, 2, 2, 3, 4, 4,…

    jquery 2023年5月27日
    00
  • JS实现淡入淡出图片效果的方法分析

    JS实现淡入淡出图片效果的方法分析 1. 简介 淡入淡出图片效果是网页开发中常见的效果之一。JS实现淡入淡出图片效果可以提高用户体验,让页面更加生动活泼。 2. 实现方法 2.1 使用CSS3实现 使用CSS3的transition属性可以实现淡入淡出图片的效果。 img { opacity: 0; transition: opacity .5s ease-…

    jquery 2023年5月27日
    00
  • jQuery event.data属性

    jQuery event.data属性是用于在事件处理程序中传递数据的属性。该属性可以用于在事件处理程序中访问传递的数据。 以下是jQuery event.data属性的详细攻略: 语法 $(selector).on(event, data, function) 参数 event:必需。规定要绑定的事件类型,例如click、mouseover或keydown…

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