责任链模式
责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象有机会处理请求,从而避免请求的发送者和接收者之间的耦合。这种模式将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
责任链模式的主要角色
- Handler(处理器接口):声明了一个用于构建链的方法以及一个用于执行请求的方法。
- ConcreteHandler(具体处理器):处理它能处理的请求,可选地在不能处理请求时将请求转发给下一个处理器。
- 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),它们按照顺序处理请假请求。
应用场景
责任链模式适用于以下几种情况:
- 当程序需要使用多个对象中的某一个来处理请求,而不知道确切是哪一个的时候。
- 当希望处理请求的对象集合可以动态指定时。
- 当想要减少请求发送者与接收者之间的耦合度时。
通过使用责任链模式,可以使系统更加灵活,易于扩展,并且能够方便地添加新的处理器而无需修改现有代码。此外,它还支持请求的动态分配,允许不同类型的请求由最适合处理它们的对象来处理。这对于构建复杂的业务逻辑流特别有用。