js设计模式之代理模式及订阅发布模式实例详解

JS设计模式之代理模式及订阅发布模式实例详解

代理模式

什么是代理模式?

代理是一种结构型模式,其目的是为其他对象提供一种代理以控制对这个对象的访问。

代理模式可以解决哪些问题?

在程序的开发过程中,我们经常会遇到需要对一个对象进行一些扩展或加强的情况。使用代理模式可以让我们更加方便地实现这一需求,同时它还可以为我们的代码提供一定的解耦和保护机制,帮助我们更好地进行模块化开发和维护。

代理模式的应用场景

代理模式常用在以下几个场景:

  1. 远程代理:隐藏一个对象存在于不同地址空间的事实。
  2. 虚拟代理:根据需要创建一个资源密集型的对象。
  3. 安全代理:用于控制真实对象的访问权限。
  4. 智能指引:在调用真实对象之前进行一些额外的处理操作。

代理模式的实现方式

下面分别介绍一些常见的代理模式实现方式。

1. 静态代理

静态代理是一个固定的代理实现,它由开发人员手动编写出一个代理类,该代理类被用于代理某个目标类,以提供对目标类的访问控制和增强。

示例代码如下:

class Subject {
  request() {
    console.log('Subject.request');
  }
}

class Proxy {
  constructor(subject) {
    this.subject = subject;
  }

  request() {
    console.log('Proxy.request');
    this.subject.request();
  }
}

const subject = new Subject();
const proxy = new Proxy(subject);
proxy.request(); // Proxy.request, Subject.request

这个示例代码中,我们创建了一个Subject类和一个Proxy类,其中Subject类是我们真正需要包装的类。在Proxy类中,我们引用了一个Subject对象,并且给出了一个request()方法,当调用该方法时,会先输出代理类的名字,然后再调用被代理对象的request()方法。

2. 动态代理

与静态代理不同的是,动态代理是在运行时动态生成的代理类,它可以执行更加复杂的代理操作。

示例代码如下:

const handler = {
  set(target, property, value) {
    console.log(`Setting ${property}=${value}`);
    target[property] = value;
  }
};

const target = {};
const proxy = new Proxy(target, handler);

proxy.name = 'Tom'; // Setting name=Tom

在这个示例代码中,我们使用ES6中的Proxy类来生成动态代理。该类接受一个被代理的目标对象和一个代理处理器,当访问和修改目标对象的属性时,会自动调用代理处理器中定义的一些函数。

订阅发布模式

什么是订阅发布模式?

订阅发布模式,也称为观察者模式,是一种行为型模式,它定义了对象之间的一种一对多的依赖关系,当一个对象状态发生改变时,所有依赖该对象的对象都会收到通知并进行相应的更新和操作。

订阅发布模式可以解决哪些问题?

订阅发布模式可以帮助代码更好地进行模块化和解耦,同时也可以大大降低代码中的重复逻辑和冗余代码。

订阅发布模式的应用场景

订阅发布模式常用在以下场景:

  1. 多个对象之间需要进行通信和数据共享。
  2. 一个对象的状态变化需要影响到其他多个对象。
  3. 需要动态地添加或删除一些操作或功能。

订阅发布模式的实现

下面给出一些订阅发布模式的实现方式。

1. 自定义事件

自定义事件是一种比较常见的实现方式,我们可以通过自定义事件来实现对象之间的通信和数据共享。

示例代码如下:

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

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

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

  off(eventName, listener) {
    if (!this.events[eventName]) {
      return;
    }
    const idx = this.events[eventName].indexOf(listener);
    if (idx >= 0) {
      this.events[eventName].splice(idx, 1);
    }
  }

  emit(eventName, ...args) {
    if (!this.events[eventName]) {
      return;
    }
    for (const listener of this.events[eventName]) {
      listener(...args);
    }
  }
}

const eventEmitter = new EventEmitter();

eventEmitter.on('test', message => {
  console.log(`Received message: ${message}`);
});

eventEmitter.emit('test', 'Hello, world!'); // Received message: Hello, world!

在这个示例代码中,我们创建了一个EventEmitter类,它维护了一个包含所有事件监听器的列表,提供了on()、off()、once()、emit()四个方法。通过调用on()方法可以添加一个事件监听器,通过emit()方法可以触发指定的事件。

2. Node.js中的events模块

在Node.js中,我们可以使用events模块来方便地实现订阅发布模式。

示例代码如下:

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();

myEmitter.on('event', () => {
  console.log('an event occurred!');
});

myEmitter.emit('event'); // an event occurred!

在这个示例代码中,我们通过require()函数引入了Node.js内置的events模块,并创建了一个自定义的MyEmitter类,该类继承自EventEmitter类。通过调用其on()方法可以添加对应的事件监听器,并通过emit()方法来触发相应的事件。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js设计模式之代理模式及订阅发布模式实例详解 - Python技术站

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

相关文章

  • 详解如何解决使用JSON.stringify时遇到的循环引用问题

    当使用 JSON.stringify() 方法时,如果对象包含循环引用,将会导致 JSON.stringify() 抛出异常并停止执行。为了解决这个问题,可以采用以下两种解决方案。 1. 自定义序列化函数 我们可以自定义对象的序列化函数,通过特定的逻辑过滤循环引用的情况,然后调用 JSON.stringify() 方法进行序列化。下面是一个示例代码: fun…

    node js 2023年6月8日
    00
  • Nodejs做文本数据处理实现详解

    关于 “Nodejs做文本数据处理实现详解” 的攻略,我将从以下几点进行讲解: Node.js基础知识和使用场景 文本数据处理的常用方法及如何在Node.js中实现 示例详解:使用Node.js读写文本文件、处理CSV文件 1. Node.js基础知识和使用场景 Node.js是一种基于Chrome V8引擎的JavaScript运行环境,可以使JavaSc…

    node js 2023年6月8日
    00
  • node.js中的fs.writeSync方法使用说明

    Node.js中的fs.writeSync方法使用说明 什么是fs.writeSync方法 fs.writeSync方法是Node.js中的一个文件操作方法,其作用是同步地向指定文件中写入数据。与fs.write方法不同的是,fs.writeSync方法是阻塞式的,因此会阻塞程序的运行直到写入操作完成。 其语法如下: fs.writeSync(fd, dat…

    node js 2023年6月8日
    00
  • node.js中的fs.chmod方法使用说明

    node.js中的fs.chmod方法使用说明 Node.js中的fs模块提供了许多与文件系统有关的API,其中包括fs.chmod方法,用于修改文件或目录的权限。 fs.chmod方法的语法 下面是fs.chmod方法的完整语法: fs.chmod(path, mode, callback) path:需要修改权限的文件或目录的路径; mode:权限码,是…

    node js 2023年6月8日
    00
  • Nodejs中crypto模块的安全知识讲解

    Node.js自带的crypto模块提供了丰富的加密、解密、哈希和随机数等方面的功能。在使用crypto模块的时候,需要注意以下几点安全知识: 1.密钥的安全存储 在加密和解密过程中,密钥扮演着非常重要的角色。因此,需要保护好密钥的安全,避免密钥泄露导致数据被非法获取。一种可行的方案是将密钥存储在本地的环境变量中,这样可以避免密钥存储在代码中导致泄露。 co…

    node js 2023年6月8日
    00
  • 教你30秒发布一个TypeScript包到NPM的方法步骤

    创建 NPM 账号 首先,你需要在 NPM 官网注册一个账号。注册账号很简单,只需要填写几个基本信息即可。若你已有账号,请跳过此步。 初始化工程 创建工程文件夹,进入此文件夹,初始化工程: npm init (在终端输入该命令后,按照提示输入参数) 安装 TypeScript 在终端输入以下命令: npm install typescript –save-…

    node js 2023年6月9日
    00
  • Nest 复杂查询示例解析

    Nest 复杂查询示例解析 简介 Nest 是一个基于 Node.js 平台的开发框架,它利用现代化的 JavaScript 技术为构建可伸缩的服务器端应用程序提供了一种优美且快速的方式。 在 Nest 中,ORM(对象关系映射)库 TypeORM 可以用于构建复杂的 SQL 查询,并通过 Nest 提供的数据访问对象(Data Access Object,…

    node js 2023年6月8日
    00
  • Web技术实现移动监测的介绍

    Web技术在移动监测领域可以发挥重要的作用,下面我将为大家详细讲解Web技术实现移动监测的介绍。 1. 移动监测的概念和需求 移动监测是指对移动设备的使用情况进行监测和分析,以便企业或个人更好地了解用户的需求并进行针对性的优化。移动监测的主要需求包括: 浏览量和访问量的统计; 用户地理位置和移动轨迹的监测; 不同移动设备访问情况的分析。 2. Web技术实现…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部