JavaScript设计模式之责任链模式实例分析

yizhihongxing

以下是“JavaScript设计模式之责任链模式实例分析”完整攻略。

标题

JavaScript设计模式之责任链模式实例分析

简介

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它用于将请求沿着处理程序链进行传递,直到其中一个处理程序能够处理该请求。该模式允许多个对象处理请求,而不必相互引用,并且请求发送者和接收者都没有对方的明确信息。责任链模式通常用于处理日志记录和错误处理等场景。

在JavaScript中,常常使用责任链模式来处理复杂的逻辑。下面我们通过两个实例来详细讲解JavaScript的责任链模式。

具体分析

实例一

假设有一个表单,需要验证用户输入的内容是否符合要求,包括长度是否合格、是否包含特殊字符等。为了使验证过程更加灵活和可扩展,我们可以使用责任链模式来实现。

class Validator {
  constructor() {
    this.nextItem = null;
  }

  setNextItem(item) {
    this.nextItem = item;
    return item;
  }

  handle(request) {}
}

class LengthValidator extends Validator {
  constructor(minLength, maxLength) {
    super();
    this.minLength = minLength;
    this.maxLength = maxLength;
  }

  handle(request) {
    const length = request.length;
    if (length >= this.minLength && length <= this.maxLength) {
      if (this.nextItem !== null) {
        return this.nextItem.handle(request);
      }
      return true;
    }
    return false;
  }
}

class SpecialCharsValidator extends Validator {
  constructor(specialChars) {
    super();
    this.specialChars = specialChars;
  }

  handle(request) {
    for (let i = 0; i < request.length; i++) {
      if (this.specialChars.indexOf(request.charAt(i)) !== -1) {
        return false;
      }
    }
    if (this.nextItem !== null) {
      return this.nextItem.handle(request);
    }
    return true;
  }
}

const validator = new LengthValidator(6, 16);
validator.setNextItem(new SpecialCharsValidator(['@', '#', '$']));
const valid = validator.handle('abc&&&');
console.log(valid); // 输出 false

在上面的代码中,我们首先定义了一个Validator类,作为所有验证类的基类。然后定义了一个LengthValidator类,用于验证字符串的长度是否合格,以及一个SpecialCharsValidator类,用于验证字符串是否包含特殊字符。在handle方法中,我们首先对传入的字符串进行验证,如果当前验证器不能完成任务,则将请求传递给下一个验证器。最后,我们使用LengthValidatorSpecialCharsValidator组成了一条验证链,并进行了一次验证。

实例二

现在我们假设有一个工程师团队,需要按照工程师级别来审批加班申请。高级工程师可以审批自己及普通工程师的加班申请,而主管可以审批所有工程师的加班申请。我们同样可以使用责任链模式来实现这个需求。

class Engineer {
  constructor(name, level) {
    this.name = name;
    this.level = level; // level:1 表示普通工程师,level:2 表示高级工程师
  }
}

class Approver {
  constructor() {
    this.nextApprover = null;
  }

  setNextApprover(approver) {
    this.nextApprover = approver;
    return approver;
  }

  approve(engineer, days) {}
}

class SeniorEngineerApprover extends Approver {
  approve(engineer, days) {
    if (engineer.level === 2 && days < 3) {
      console.log(`${engineer.name}的加班申请已经被高级工程师审批通过`);
      return true;
    }
    if (this.nextApprover !== null) {
      return this.nextApprover.approve(engineer, days);
    }
    return false;
  }
}

class DirectorApprover extends Approver {
  approve(engineer, days) {
    console.log(`${engineer.name}的加班申请已经被主管审批通过`);
    return true;
  }
}

// 创建工程师数组
const engineers = [
  new Engineer('张三', 1),
  new Engineer('李四', 2),
  new Engineer('王五', 1),
];
// 创建责任链
const seniorEngineer = new SeniorEngineerApprover();
const director = new DirectorApprover();
seniorEngineer.setNextApprover(director);

// 处理加班申请
engineers.forEach(engineer => {
  const days = Math.floor(Math.random() * 5);
  seniorEngineer.approve(engineer, days);
})

在上面的代码中,我们首先定义了一个Engineer类,用于表示工程师的基本信息。然后定义了一个Approver类,作为所有审批类的基类。然后定义了一个SeniorEngineerApprover类,用于处理高级工程师的加班申请,以及一个DirectorApprover类,用于处理主管的加班申请。在approve方法中,我们首先对传入的工程师和加班天数进行验证,如果当前审批者不能完成任务,则将审批请求传递给下一个审批者。最后,我们使用SeniorEngineerApproverDirectorApprover组成了一条审批链,并对所有工程师进行了加班申请审批。

结论

责任链模式是一种非常实用的设计模式,可以将复杂的操作逻辑分解成多个小的操作块,提高了代码的可读性和可维护性。在实际的工作中,我们经常会通过责任链模式来处理复杂的业务逻辑,如表单验证、请求处理、审批流程等。同时,在使用责任链模式时,我们需要注意类之间的依赖关系,避免形成循环依赖。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript设计模式之责任链模式实例分析 - Python技术站

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

相关文章

  • 方法区的作用是什么?

    以下是关于 Java 方法区的详细讲解和使用攻略: 方法区的作用是什么? Java 方法区是一种用于存储已加载类信息、常量、静态变量、即时编编译后的代码数据的内存区域。方法区是线程共享的,其大小可以通过 -XX:MetaspaceSize 参数进行设置。 方法区的使用攻略 使用 Java 方法区,需要注意以下几点: 在程序开发中,需要合理使用内存,避免出现内…

    Java 2023年5月12日
    00
  • java Date和SimpleDateFormat时间类详解

    Java Date 和 SimpleDateFormat 时间类详解 Java Date 和 SimpleDateFormat 是 Java 日期/时间处理中最常用的类,可以方便地进行日期和时间格式化、解析和计算。本文将详细讲解 Java Date 和 SimpleDateFormat 的使用方法,包括创建 Date 对象、格式化日期和时间、解析字符串为 D…

    Java 2023年5月20日
    00
  • maven搭建spring项目(图文教程)

    我来详细讲解“maven搭建spring项目(图文教程)”的完整攻略。 一、环境要求 在开始前,请确保你已经安装了以下环境: JDK 1.8或以上 Maven 二、创建Maven项目 打开命令行工具,进入一个空的目录,执行以下命令: mvn archetype:generate -DgroupId=com.example -DartifactId=sprin…

    Java 2023年5月19日
    00
  • Spring声明式事务配置使用详解

    Spring声明式事务配置使用详解 什么是事务 事务是一组完整的业务操作,这些操作作为一个原子单元,要么全部成功,要么全部失败回滚,保证数据库中的数据一致性。 声明式事务的优点 Spring框架提供的声明式事务管理有以下几个好处: 代码简洁:通过使用声明式事务管理,Spring框架可以将所有的数据库事务处理的代码都放在配置文件中,这样就不需要在业务逻辑代码中…

    Java 2023年5月20日
    00
  • 基于Java中进制的转换函数详解

    基于Java中进制的转换函数详解 什么是进制? 进制是数学中一种表示数值大小的方法,常见的进制有10进制、2进制、16进制等。 在计算机科学中,2进制是最常用的进制,因为计算机仅能识别0和1,而所有的数值、字符、图片等都可以用二进制表示。 Java中进制转换函数 Java中提供了许多用于进制转换的函数,如下:- Integer.parseInt(String…

    Java 2023年5月26日
    00
  • Java中的线程池是什么?

    线程池是一种用于处理多线程应用程序的机制,它可以实现线程的复用,避免不必要的线程创建与销毁,提高线程的执行效率和稳定性。在Java中,线程池由java.util.concurrent包提供,它提供了线程池的管理和维护,使得多线程应用程序更加高效和可维护。 Java中的线程池主要由以下四个组件构成: Thread Pool Manager(线程池管理器):用于…

    Java 2023年4月27日
    00
  • 关于@Query注解的用法(Spring Data JPA)

    当我们使用 Spring Data JPA 进行数据库操作时,经常需要根据特定的条件查询数据,@Query 注解可以用来定义自定义查询语句,让我们可以像原生 SQL 语句一样写出灵活的查询语句。下面是 @Query 注解的详细介绍和使用方法。 什么是 @Query 注解 @Query 是 Spring Data JPA 提供的一种查询注解,用来定义自定义查询…

    Java 2023年5月20日
    00
  • 详解Java的JDBC API的存储过程与SQL转义语法的使用

    详解Java的JDBC API的存储过程与SQL转义语法的使用 什么是存储过程? 存储过程是一种预定义在数据库中的过程,通过一条语句的执行,可以调用存储过程来完成一系列操作。存储过程通常用于执行重复性的任务。 在Java中,我们可以使用JDBC API来访问数据库,并执行存储过程。 JDBC API中调用存储过程的方法 在Java中,我们可以使用JDBC的C…

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