14.责任链模式
责任链模式(Chain of Responsibility Pattern)的主要目的是把请求沿处理链依次传递,让多个处理者有机会处理同一请求
适合使用责任链模式的场景
- 一个请求可能被多个处理者中的某一个处理
- 希望动态调整处理顺序和处理节点
- 不希望请求发起方直接依赖具体处理者
- 需要把复杂判断链拆成独立节点以便扩展
请求类型与抽象处理者
interface LeaveRequest {
user: string;
days: number;
}
abstract class Handler {
private next: Handler | null = null;
setNext(handler: Handler): Handler {
this.next = handler;
return handler;
}
protected pass(req: LeaveRequest): string {
if (this.next) {
return this.next.handle(req);
}
return `无人可审批:${req.user} ${req.days} 天`;
}
abstract handle(req: LeaveRequest): string;
}具体处理者
class Leader extends Handler {
handle(req: LeaveRequest): string {
if (req.days <= 2) {
return `Leader 审批通过:${req.user}`;
}
return this.pass(req);
}
}
class Manager extends Handler {
handle(req: LeaveRequest): string {
if (req.days <= 5) {
return `Manager 审批通过:${req.user}`;
}
return this.pass(req);
}
}
class Director extends Handler {
handle(req: LeaveRequest): string {
if (req.days <= 10) {
return `Director 审批通过:${req.user}`;
}
return this.pass(req);
}
}使用示例
const leader = new Leader();
const manager = new Manager();
const director = new Director();
leader.setNext(manager).setNext(director);
console.log(leader.handle({ user: "Alice", days: 4 }));