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

以下是“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的milo框架访问OPCUA服务的过程

    使用Java的Milo框架访问OPCUA服务的过程包括以下步骤: 引入依赖 在Maven项目中,需要在pom.xml文件中引入以下依赖: <dependencies> <dependency> <groupId>org.eclipse.milo</groupId> <artifactId>milo-…

    Java 2023年5月20日
    00
  • 导入项目出现Java多个工程相互引用异常A cycle was detected in the build path of project的解决办法

    当我们在导入一个Java项目时,可能会遇到工程之间相互引用的异常提示:“A cycle was detected in the build path of project”。这种情况下,我们不能正常构建我们的项目,此时我们需要采取一些解决措施。 以下是完整的解决方案: 原因 这个异常通常发生在多个Java工程之间相互引用的情况下。出现这个异常的原因通常是因为…

    Java 2023年5月27日
    00
  • 大家在抢红包,程序员在研究红包算法

    让我来详细讲解一下「大家在抢红包,程序员在研究红包算法」这一话题。 首先,我们需要了解什么是「红包算法」。简单来说,红包算法就是计算如何分配一定数量的金额到多个红包里面,让每个红包的金额尽可能地公平分配。红包算法有很多种,比如「平均法」、「随机法」、「二倍均值法」等等。 接下来,我们先介绍一下「平均法」,因为这是最简单的红包算法之一。平均法的算法逻辑非常简单…

    Java 2023年5月26日
    00
  • Java使用正则表达式检索、替换String中特定字符和正则表达式的一切

    Java中使用正则表达式进行字符串的检索、替换等操作主要依靠Java.util.regex包中提供的类和方法。下面将从如下几个方面,介绍Java使用正则表达式进行检索、替换操作的完整攻略: 正则表达式的基础知识 在使用Java进行正则表达式操作之前,我们需要先了解一些正则表达式的基础知识,包括常用的正则表达式符号/语法、匹配模式等。下面给出一个简单的正则表达…

    Java 2023年5月27日
    00
  • springboot多环境配置方案(不用5分钟)

    下面是详细讲解“springboot多环境配置方案(不用5分钟)”的完整攻略: 1. 原理 Spring Boot 支持通过不同的配置文件来管理不同的环境。它提供了一个标准的命名规则:application-{profile}.properties/yml,比如 application-dev.yml,application-test.yml,applica…

    Java 2023年5月15日
    00
  • Java超详细讲解WebMvcConfigurer拦截器

    下面是关于“Java超详细讲解WebMvcConfigurer拦截器”的完整攻略,包含两个示例说明。 Java超详细讲解WebMvcConfigurer拦截器 在Spring MVC中,我们可以使用拦截器来拦截请求并进行一些处理。WebMvcConfigurer是一个接口,它提供了一些方法来配置Spring MVC的行为,其中包括添加拦截器。本文将详细讲解W…

    Java 2023年5月17日
    00
  • java的新特性反射机制应用及操作示例详解

    Java 的反射机制 什么是反射机制 反射机制是一种使 Java 非常强大且灵活的技术。反射机制允许在运行时动态地获取类的属性、方法和构造函数,同时也可以动态地调用这些方法、属性和构造函数。 反射机制使用 java.lang.reflect 包获取一个类的相关信息。反射的一些常见应用包括:动态代理、单元测试和框架开发。在框架开发中,我们通常会在编译时不知道某…

    Java 2023年5月26日
    00
  • SpringMVC注解@RequestParam方法原理解析

    以下是关于“SpringMVC注解@RequestParam方法原理解析”的完整攻略,其中包含两个示例。 SpringMVC注解@RequestParam方法原理解析 SpringMVC是一个基于Java的Web框架,它可以帮助我们快速开发Web应用程序。@RequestParam是SpringMVC中的一个注解,它可以帮助我们获取HTTP请求中的参数。本文…

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