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实现增删改查

    下面将详细讲解“jQuery实现增删改查”的完整攻略。 增加数据 可以通过以下步骤使用jQuery实现向数据库添加数据: 在页面上创建一个表单,并使用jQuery选择器选择表单元素。 为表单元素添加提交事件,以便在表单被提交时执行代码。 防止表单默认提交行为,并通过jQuery的ajax方法将数据发送到服务器。 使用ajax请求返回数据 示例代码: HTML…

    jquery 2023年5月28日
    00
  • 了解JavaScript中let语句

    当我们在编写JavaScript程序时,经常会使用变量来存储值。在ES6以前,我们通常使用var关键字来定义变量。但是在ES6中,我们可以使用let关键字定义变量。在这篇攻略中,我将详细讲解如何了解JavaScript中let语句。 什么是let语句 let语句是一个声明局部变量的关键字。在使用let声明的变量,只能在当前的代码块中使用。let关键字具有块级…

    jquery 2023年5月28日
    00
  • jQWidgets jqxBarcode displayLabel属性

    jQWidgets是一个基于jQuery的UI组件库,提供了丰富的UI组件和工具,包括表格、图表、表单、日历、菜单等。其中,jqxBarcode是jQWidgets中的一个条形码组件,可以用于生成各种类型的条形码。jqxBarcode组件具有多种属性,其中displayLabel属性用于控制是否显示条形码标签。 displayLabel属性 displayL…

    jquery 2023年5月9日
    00
  • 如何使用jQuery获取对象的名称

    要使用jQuery获取对象的名称,我们可以使用以下步骤: 使用$()函数选择需要获取名称的元素。 使用.prop()函数获取元素的属性。 使用.nodeName属性获取元素的名称。 以下是两个示例,演示如何使用jQuery获取对象的名称: 示例1:获取单个元素的名称 以下是一个示例,演示如何使用jQuery获取单个元素的名称: <!DOCTYPE ht…

    jquery 2023年5月9日
    00
  • jQWidgets jqxWindow minHeight属性

    下面我就为你详细讲解一下“jQWidgets jqxWindow minHeight属性”的完整攻略。 1. 什么是jqxWindow? jqxWindow是jQWidgets UI库的一个组件,它为网站开发者提供了一个用于创建和管理窗体的工具。jqxWindow不仅可以扮演窗体的角色,还可以作为对话框和通知框的载体,它支持样式定制、位置管理、拖拽操作、最大…

    jquery 2023年5月12日
    00
  • JS实现的新闻列表自动滚动效果示例

    JS实现新闻列表自动滚动效果是一个常见的网页特效,它能够高效地展示网站上的新闻、文章、产品等信息,提高网站信息展示的效率和吸引度。在此,我将为大家介绍如何实现一个JS自动滚动效果,并提供两个实例说明来帮助大家更好地理解和应用。 准备工作 在开始制作自动滚动效果之前,我们需要先准备好一些工具和素材: 基于HTML和CSS的网页布局和样式 JavaScript代…

    jquery 2023年5月27日
    00
  • jQuery Ajax中的事件详细介绍

    jQuery Ajax中的事件主要有以下几种: beforeSend(请求发送前) error(请求失败时) success(请求成功后) complete(请求完成后,无论成功或失败) statusCode(根据HTTP状态码进行处理) 下面我们对每个事件进行详细介绍,并提供相应的示例说明。 beforeSend 在发送实际请求之前,可以使用beforeS…

    jquery 2023年5月27日
    00
  • jQWidgets jqxGrid setcolumnindex()方法

    以下是关于“jQWidgets jqxGrid setcolumnindex()方法”的完整攻略,包含两个示例说明: 方法简介 setcolumnindex(datafield, index) 方法是jQWidgets jqxGrid 控件的一个方法,用于设置列的索引位置。该方法的语法如下: $("#jqxGridjqxGrid(‘setcolum…

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