1. <tfoot id='Mrh7v'></tfoot><legend id='Mrh7v'><style id='Mrh7v'><dir id='Mrh7v'><q id='Mrh7v'></q></dir></style></legend>

      <small id='Mrh7v'></small><noframes id='Mrh7v'>

        <i id='Mrh7v'><tr id='Mrh7v'><dt id='Mrh7v'><q id='Mrh7v'><span id='Mrh7v'><b id='Mrh7v'><form id='Mrh7v'><ins id='Mrh7v'></ins><ul id='Mrh7v'></ul><sub id='Mrh7v'></sub></form><legend id='Mrh7v'></legend><bdo id='Mrh7v'><pre id='Mrh7v'><center id='Mrh7v'></center></pre></bdo></b><th id='Mrh7v'></th></span></q></dt></tr></i><div id='Mrh7v'><tfoot id='Mrh7v'></tfoot><dl id='Mrh7v'><fieldset id='Mrh7v'></fieldset></dl></div>

          <bdo id='Mrh7v'></bdo><ul id='Mrh7v'></ul>
      1. JavaScript设计模式之责任链模式实例分析

        时间:2023-12-10
          <bdo id='NVIbb'></bdo><ul id='NVIbb'></ul>
          <i id='NVIbb'><tr id='NVIbb'><dt id='NVIbb'><q id='NVIbb'><span id='NVIbb'><b id='NVIbb'><form id='NVIbb'><ins id='NVIbb'></ins><ul id='NVIbb'></ul><sub id='NVIbb'></sub></form><legend id='NVIbb'></legend><bdo id='NVIbb'><pre id='NVIbb'><center id='NVIbb'></center></pre></bdo></b><th id='NVIbb'></th></span></q></dt></tr></i><div id='NVIbb'><tfoot id='NVIbb'></tfoot><dl id='NVIbb'><fieldset id='NVIbb'></fieldset></dl></div>
                <tbody id='NVIbb'></tbody>

              <legend id='NVIbb'><style id='NVIbb'><dir id='NVIbb'><q id='NVIbb'></q></dir></style></legend>

                • <tfoot id='NVIbb'></tfoot>
                • <small id='NVIbb'></small><noframes id='NVIbb'>

                  以下是“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组成了一条审批链,并对所有工程师进行了加班申请审批。

                  结论

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

                  上一篇:PHP排序算法之堆排序(Heap Sort)实例详解 下一篇:Java 把json对象转成map键值对的方法

                  相关文章

                    <tfoot id='0kBfi'></tfoot>
                    • <bdo id='0kBfi'></bdo><ul id='0kBfi'></ul>
                    <legend id='0kBfi'><style id='0kBfi'><dir id='0kBfi'><q id='0kBfi'></q></dir></style></legend>
                  1. <i id='0kBfi'><tr id='0kBfi'><dt id='0kBfi'><q id='0kBfi'><span id='0kBfi'><b id='0kBfi'><form id='0kBfi'><ins id='0kBfi'></ins><ul id='0kBfi'></ul><sub id='0kBfi'></sub></form><legend id='0kBfi'></legend><bdo id='0kBfi'><pre id='0kBfi'><center id='0kBfi'></center></pre></bdo></b><th id='0kBfi'></th></span></q></dt></tr></i><div id='0kBfi'><tfoot id='0kBfi'></tfoot><dl id='0kBfi'><fieldset id='0kBfi'></fieldset></dl></div>

                  2. <small id='0kBfi'></small><noframes id='0kBfi'>