职责链模式(Chain of Responsibility)
职责链模式是一种行为设计模式, 允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。 
责任链模式结构

处理者 (Handler) 声明了所有具体处理者的通用接口。 该接口通常仅包含单个方法用于请求处理, 但有时其还会包含一个设置链上下个处理者的方法。
基础处理者 (Base Handler) 是一个可选的类, 你可以将所有处理者共用的样本代码放置在其中。
通常情况下, 该类中定义了一个保存对于下个处理者引用的成员变量。 客户端可通过将处理者传递给上个处理者的构造函数或设定方法来创建链。 该类还可以实现默认的处理行为: 确定下个处理者存在后再将请求传递给它。
具体处理者 (Concrete Handlers) 包含处理请求的实际代码。 每个处理者接收到请求后, 都必须决定是否进行处理, 以及是否沿着链传递请求。
处理者通常是独立且不可变的, 需要通过构造函数一次性地获得所有必要地数据。
客户端 (Client) 可根据程序逻辑一次性或者动态地生成链。 值得注意的是, 请求可发送给链上的任意一个处理者, 而非必须是第一个处理者。
代码示例
ts
// Handler接口声明了一个用于构建处理程序链的方法。它还声明了一个用于执行请求的方法。
abstract class Handler {
constructor(name: string) {
this.name = name;
}
public setSuccesser(successer: Handler): void {
this.successer = successer;
}
public handleRequest(request: number): void {
}
successer!: Handler;
name: string;
}
//默认的链接行为可以在基处理程序类中实现。
//所有具体处理程序要么处理请求,要么将其传递给链中的下一个处理程序。
class ConcreteHandler1 extends Handler {
constructor(name: string) {
super(name);
}
public handleRequest(request: number): void {
if (request >= 0 && request < 10) {
console.log(`${request} is handled by ${this.constructor.name}`);
} else if (this.successer) {
this.successer.handleRequest(request);
}
}
}
class ConcreteHandler2 extends Handler {
constructor(name: string) {
super(name);
}
public handleRequest(request: number): void {
if (request >= 10 && request < 20) {
console.log(`${request} is handled by ${this.constructor.name}`);
} else if (this.successer) {
this.successer.handleRequest(request);
}
}
}
class ConcreteHandler3 extends Handler {
constructor(name: string) {
super(name);
}
public handleRequest(request: number): void {
if (request >= 20 && request < 30) {
console.log(`${request} is handled by ${this.constructor.name}`);
} else if (this.successer) {
this.successer.handleRequest(request);
}
else {
console.log(`${request} is not handled`);
}
}
}
function client(): void {
const handler1 = new ConcreteHandler1("handler1");
const handler2 = new ConcreteHandler2("handler2");
const handler3 = new ConcreteHandler3("handler3");
handler1.setSuccesser(handler2);
handler2.setSuccesser(handler3);
handler1.handleRequest(0);
handler1.handleRequest(9);
handler1.handleRequest(10);
handler1.handleRequest(19);
handler1.handleRequest(20);
handler1.handleRequest(29);
handler1.handleRequest(30);
handler1.handleRequest(39);
handler1.handleRequest(40);
}
client();运行结果
ts
0 is handled by ConcreteHandler1
9 is handled by ConcreteHandler1
10 is handled by ConcreteHandler2
19 is handled by ConcreteHandler2
20 is handled by ConcreteHandler3
29 is handled by ConcreteHandler3
30 is not handled
39 is not handled
40 is not handled