NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】

NodeJS设计模式总结

本文总结了 NodeJS 中常用的设计模式,包括:

  • 单例模式
  • 适配器模式
  • 装饰模式
  • 观察者模式

单例模式

单例模式保证一个类只有一个实例,并提供一个全局的访问入口。

在 NodeJS 中实现单例模式可以通过 module.exports 将类的实例赋值给一个变量,这个变量就成为了全局的访问入口。

示例代码:

// Singleton.js

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

  static getInstance() {
    if (!this.instance) {
      this.instance = new Singleton();
    }
    return this.instance;
  }
}

module.exports = Singleton.getInstance(); // 将类的实例赋值给变量

在其他文件中引入 Singleton,可以获得同一个实例:

// test.js

const Singleton = require('./Singleton');

console.log(Singleton.id); //每次打印都会得到相同的随机数

适配器模式

适配器模式将一个接口转换成另一个接口,使得原本不兼容的类能够在一起工作。在 NodeJS 中常用的场景是将老代码接入新代码中,或者将不同第三方库中的接口统一。

示例代码:

// 旧的代码库中的接口
class OldAPI {
  getName() {
    return 'old API name';
  }
}

// 统一了不同的 API 接口
class Adapter {
  constructor() {
    this.newAPI = new NewAPI();
  }

  getName() {
    return this.newAPI.getUserName();
  }
}

// 新的代码库中的接口
class NewAPI {
  getUserName() {
    return 'new API name';
  }
}

const adapter = new Adapter();
console.log(adapter.getName()); // new API name

这里通过适配器模式将不同的 API 接口转换成了统一的接口。在 Adapter 类中,实例化了 NewAPI 并将其包装成了一个新的接口,将这个接口与旧代码库中的接口进行了统一,通过 adapter.getName() 调用时,会返回新 API 中的名称。

装饰模式

装饰模式在不改变一个对象的基础上,动态地给对象添加新的功能。在 NodeJS 中常用的场景是对已有的函数或服务进行扩展或包装。

示例代码:

// 原始服务
function service() {
  return 'service';
}

// 装饰器,扩展原始服务功能
function decorator(originalFunction) {
  return function() {
    const result = originalFunction.call(this, ...arguments);
    return `${result} + decorator`;
  };
}

const decoratedService = decorator(service);
console.log(decoratedService()); // service + decorator

这里通过装饰器扩展了原始服务的功能,在原基础上添加了一个后缀。

观察者模式

观察者模式指的是对象间的一种一对多的依赖关系,使得当一个对象状态发生改变时,所有依赖它的对象都会得到通知并自动更新。

在 NodeJS 中常用事件模型实现观察者模式,事件触发者相当于被观察者,事件监听者则相当于观察者。

示例代码:

// 观察者类
class Observer {
  constructor(name) {
    this.name = name;
  }

  update(message) {
    console.log(`${this.name} has received message: ${message}`);
  }
}

// 观察目标类
class Subject {
  constructor() {
    this.observers = [];
  }

  addObserver(observer) { // 添加观察者
    this.observers.push(observer);
  }

  removeObserver(observer) { // 删除观察者
    const index = this.observers.indexOf(observer);
    this.observers.splice(index, 1);
  }

  notifyObservers(message) { // 通知观察者
    this.observers.forEach(observer => observer.update(message));
  }
}

const subject = new Subject();

const observer1 = new Observer('Observer-1');
const observer2 = new Observer('Observer-2');

subject.addObserver(observer1);
subject.addObserver(observer2);

subject.notifyObservers('Hello world!'); // Observer-1 has received message: Hello world!
                                       // Observer-2 has received message: Hello world!

在这个示例中,Observer 类表示观察者,Subject 类表示被观察者。Subject 类中维护了一个 observers 数组,存储所有观察者。addObserverremoveObserver 方法用于添加或删除观察者。notifyObservers 方法用于通知所有的观察者,并将消息传入观察者的 update 方法中,在这个方法中观察者完成响应动作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】 - Python技术站

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

相关文章

  • 如何解决sass-loader和node-sass版本冲突的问题

    要解决 sass-loader 和 node-sass 版本冲突的问题,需要进行以下步骤: 确认项目中的依赖 首先要确定项目中已经安装的 sass-loader 和 node-sass 版本。可以通过运行下面的命令来查看当前项目中安装的版本号: npm ls sass-loader node-sass 该命令将会输出当前项目中 sass-loader 和 n…

    node js 2023年6月8日
    00
  • Node.js返回JSONP详解

    一、什么是JSONP? JSONP是一种跨域访问数据的方式,它通过动态生成script标签,将请求发送到跨域地址上,跨域地址返回一段特定格式的JavaScript代码,调用一个回调函数,将数据作为参数传递给该函数。由于script标签不受同源策略的限制,因此可以轻松实现跨域请求数据的功能。 二、JSONP的实现原理 创建script标签,将请求发送至跨域地址…

    node js 2023年6月8日
    00
  • Node.js中ES6模块化及Promise对象

    我来详细讲解一下。 Node.js中的ES6模块化 从Node.js v13.2.0版本开始,Node.js开始原生支持ES6模块化。在ES6模块化中,一个模块就是一个独立的文件,每个模块可以导出自己的内容,也可以导入其他模块的内容。ES6模块化与CommonJS模块化有所不同,需要使用不同的导入和导出语法。 导出模块 ES6模块化通过使用 export 来…

    node js 2023年6月8日
    00
  • Vite + React从零开始搭建一个开源组件库

    下面是详细讲解“Vite + React从零开始搭建一个开源组件库”的完整攻略。 一、前置知识 在学习“Vite + React从零开始搭建一个开源组件库”之前,需要具备以下知识: 基础的HTML、CSS、JavaScript的知识 熟悉React框架及其生态圈 熟悉ES6语法以及模块化编程思想 熟悉npm包管理工具 熟悉Git版本控制工具 二、搭建项目 1…

    node js 2023年6月9日
    00
  • 浅谈Node.js中的定时器

    下面是浅谈Node.js中的定时器的完整攻略。 什么是Node.js中的定时器 在Node.js中,定时器是指一种可以让代码在指定的时间间隔内重复执行的机制。Node.js中有三种类型的定时器,分别是setTimeout、setInterval、setImmediate。这些定时器都是全局可用的函数,可以在任何地方调用。 setTimeout setTime…

    node js 2023年6月8日
    00
  • nodejs使用node-xlsx生成excel的方法示例

    下面我来详细介绍如何使用node-xlsx生成Excel的方法。 1. 安装node-xlsx 第一步是安装node-xlsx这个包。 在命令行中输入以下命令: npm install node-xlsx –save 2. 创建Excel文件 创建一个Excel文件的步骤如下: 创建一个工作簿(Workbook); 往工作簿里面添加一个工作表(Worksh…

    node js 2023年6月8日
    00
  • node-sass@4.14.1报错的最终解决方案分享

    下面是关于“node-sass@4.14.1报错的最终解决方案分享”的完整攻略: 背景 首先,我们需要了解背景。node-sass是一个常用的将SCSS预处理器编译为CSS的工具,但在使用过程中,有些用户报告了“node-sass@4.14.1报错”的问题,原因是由于该版本的node-sass包是使用了一个已经被废弃的依赖项(libsass库)。这导致了编译…

    node js 2023年6月8日
    00
  • javascript将16进制的字符串转换为10进制整数hex

    要将16进制的字符串转换为10进制整数hex,可以使用以下代码: let hex = "1a"; // 16进制字符串 let dec = parseInt(hex, 16); // 将16进制字符串转换为10进制整数 console.log(dec); // 输出10进制整数16 解析上述代码: 第一行,定义一个16进制字符串 第二行,…

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