Skip to content

责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象有机会处理请求,从而避免请求的发送者和接收者之间的耦合。这种模式将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。

责任链模式的主要角色

  1. Handler(处理器接口):声明了一个用于构建链的方法以及一个用于执行请求的方法。
  2. ConcreteHandler(具体处理器):处理它能处理的请求,可选地在不能处理请求时将请求转发给下一个处理器。
  3. Client(客户端):负责创建责任链,并向链上的第一个处理器提交请求。

在 JavaScript 中的实现

下面通过一个简单的例子来说明如何在 JavaScript 中使用责任链模式:

示例:审批流程

假设我们需要设计一个系统来处理员工的请假申请,不同的领导根据请假天数有不同的审批权限。

javascript
// Handler(处理器接口)
class Handler {
  setNext(handler) {
    this.nextHandler = handler;
    return handler; // 允许链式调用
  }

  handle(request) {
    if (this.nextHandler) {
      return this.nextHandler.handle(request);
    }
    return null;
  }
}

// ConcreteHandler(具体处理器)
class Supervisor extends Handler {
  handle(request) {
    if (request.daysOff <= 2) {
      console.log(
        `Supervisor approves ${request.employee} for ${request.daysOff} days off.`
      );
    } else {
      console.log(
        `Supervisor cannot approve ${request.employee}'s request for ${request.daysOff} days off.`
      );
      return super.handle(request);
    }
  }
}

class Manager extends Handler {
  handle(request) {
    if (request.daysOff > 2 && request.daysOff <= 5) {
      console.log(
        `Manager approves ${request.employee} for ${request.daysOff} days off.`
      );
    } else {
      console.log(
        `Manager cannot approve ${request.employee}'s request for ${request.daysOff} days off.`
      );
      return super.handle(request);
    }
  }
}

class HR extends Handler {
  handle(request) {
    console.log(
      `HR approves ${request.employee} for ${request.daysOff} days off.`
    );
  }
}

// 使用示例
const supervisor = new Supervisor();
const manager = new Manager();
const hr = new HR();

supervisor.setNext(manager).setNext(hr);

const requests = [
  { employee: "John", daysOff: 1 },
  { employee: "Jane", daysOff: 4 },
  { employee: "Bob", daysOff: 7 },
];

requests.forEach((request) => supervisor.handle(request));

代码解释

  • Handler(处理器接口):定义了setNext方法用于设置下一个处理器,以及handle方法用于处理请求或转发请求到下一个处理器。
  • Supervisor、Manager 和 HR(具体处理器):每个具体的处理器都实现了handle方法,根据特定条件决定是否处理请求。如果当前处理器无法处理请求,则会调用super.handle(request)将请求转发给下一个处理器。
  • 使用示例:展示了如何构建责任链并将请求提交给链条的第一个处理器。在这个例子中,我们有三个处理器:主管(Supervisor)、经理(Manager)和人力资源(HR),它们按照顺序处理请假请求。

应用场景

责任链模式适用于以下几种情况:

  • 当程序需要使用多个对象中的某一个来处理请求,而不知道确切是哪一个的时候。
  • 当希望处理请求的对象集合可以动态指定时。
  • 当想要减少请求发送者与接收者之间的耦合度时。

通过使用责任链模式,可以使系统更加灵活,易于扩展,并且能够方便地添加新的处理器而无需修改现有代码。此外,它还支持请求的动态分配,允许不同类型的请求由最适合处理它们的对象来处理。这对于构建复杂的业务逻辑流特别有用。

Released under the MIT License.