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

yizhihongxing

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日

相关文章

  • javascript 框架小结 个人工作经验

    Javascript框架小结个人工作经验 介绍 Javascript框架是前端开发中非常重要的一项技术,几乎所有框架都致力于简化JS的开发流程。选择一个好的框架能够提高生产效率和开发体验,并且可以让代码更具有可维护性和可扩展性。 在本篇文章中,我们将梳理一些常用的JS框架,并分享我的个人工作经验。 常用框架 下面列出的框架是我们使用过的一些常见框架: Rea…

    node js 2023年6月8日
    00
  • 基于nodejs的微信JS-SDK简单应用实现

    作为网站的作者,我很高兴为大家介绍“基于nodejs的微信JS-SDK简单应用实现”的完整攻略。 具体步骤 1. 注册开发者账号 首先需要在微信公众平台上注册成为开发者,得到相应的AppID和AppSecret。具体步骤如下: 打开微信公众平台官网 点击右上角“注册”,按照提示进行填写 注册完成后登录,进入管理后台 在左侧导航栏中找到“开发->基本配置…

    node js 2023年6月8日
    00
  • JS调用某段SQL语句的方法

    在Javascript中调用SQL语句的方法需要借助数据库中间件或是直接调用浏览器提供的IndexedDB API进行操作。 使用数据库中间件 数据库中间件如Firefox的sql.js,可以让JavaScript直接操作SQLite数据库。可以类似于如下方式调用: const SQL = require(‘sql.js’); const fs = requ…

    node js 2023年6月8日
    00
  • nodejs中的express-jwt的使用解读

    下面就来详细讲解“nodejs中的express-jwt的使用解读”的完整攻略。 什么是express-jwt express-jwt是一个基于jwt(jsonwebtoken)认证的中间件,用于验证客户端发来的请求是否合法。 安装express-jwt 在终端中运行以下命令来安装express-jwt: npm install express-jwt 使用…

    node js 2023年6月8日
    00
  • node+express+ejs使用模版引擎做的一个示例demo

    下面是详细讲解“node+express+ejs使用模版引擎做的一个示例demo”的完整攻略。 什么是Node.js Node.js是一个基于Chrome V8 JavaScript引擎的开源、跨平台的JavaScript运行环境。它可以使JavaScript在服务器端运行,用于构建快速的网络应用程序。 什么是Express Express是一个基于Node…

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

    来讲一下“node.js中的fs.lstatSync方法使用说明”的完整攻略。 简介 node.js中的fs模块提供了很多API用于文件系统操作,其中fs.lstatSync方法是以同步的方式检索文件或目录的基本信息的。lstatSync方法返回一个包含文件信息的对象,包括文件类型、大小、创建修改时间等等。 语法 const fs = require(‘fs…

    node js 2023年6月8日
    00
  • win7下安装配置node.js+express开发环境

    下面是在win7下安装配置node.js+express开发环境的完整攻略,包含以下步骤: 1. 安装Node.js 1.1 下载 打开Node.js官网(https://nodejs.org),根据自己的电脑系统下载安装包,一般情况下你需要选择”Windows Installer (.msi)”。 1.2 安装 下载完成后,双击打开安装包,按照提示完成安装…

    node js 2023年6月8日
    00
  • 快速搭建简易、高效、多线程http服务器

    以下是详细讲解“快速搭建简易、高效、多线程http服务器”的完整攻略。 环境准备 在搭建http服务器之前,需要确保你的计算机上已安装以下软件包: Python 3.x Flask、Flask-restful、Websockets等Python web框架和工具包 搭建简易http服务器 步骤1:编写简单的Flask应用 首先,我们需要编写一个简单的Flas…

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