责任链模式
责任链模式是一种行为设计模式,允许你将请求沿着处理者链进行发送。收到请求后,每个处理者均可对请求进行处理,或将其传递给链上的下个处理者。
示意图
示例代码
以处理请求为例,我们创建一个处理请求的链。每个处理器可以决定是否能够处理该请求,如果不能则将请求传递给下一个处理器。
ts
interface Request {
type: string;
}
abstract class ChainHandler {
private nextHandler?: ChainHandler;
private sendRequestToNextHandler(request: Request): void {
if (this.nextHandler) {
this.nextHandler.handle(request);
}
}
protected abstract canHandleRequest(request: Request): boolean;
protected abstract processRequest(request: Request): boolean;
public setNext(handler: ChainHandler) {
this.nextHandler = handler;
}
public handle(request: Request) {
if (this.canHandleRequest(request)) {
return this.processRequest(request);
} else {
return this.sendRequestToNextHandler(request);
}
}
}
class ConcreteHandler1 extends ChainHandler {
protected canHandleRequest(request: Request): boolean {
return request.type === 'A';
}
protected processRequest(request: Request): boolean {
console.log('Handling request with ConcreteHandler1');
return true;
}
}
class ConcreteHandler2 extends ChainHandler {
protected canHandleRequest(request: Request): boolean {
return request.type === 'B';
}
protected processRequest(request: Request): boolean {
console.log('Handling request with ConcreteHandler2');
return true;
}
}
const handler1 = new ConcreteHandler1();
const handler2 = new ConcreteHandler2();
handler1.setNext(handler2);
handler1.handle({ type: 'A' });
interface Request {
type: string;
}
abstract class ChainHandler {
private nextHandler?: ChainHandler;
private sendRequestToNextHandler(request: Request): void {
if (this.nextHandler) {
this.nextHandler.handle(request);
}
}
protected abstract canHandleRequest(request: Request): boolean;
protected abstract processRequest(request: Request): boolean;
public setNext(handler: ChainHandler) {
this.nextHandler = handler;
}
public handle(request: Request) {
if (this.canHandleRequest(request)) {
return this.processRequest(request);
} else {
return this.sendRequestToNextHandler(request);
}
}
}
class ConcreteHandler1 extends ChainHandler {
protected canHandleRequest(request: Request): boolean {
return request.type === 'A';
}
protected processRequest(request: Request): boolean {
console.log('Handling request with ConcreteHandler1');
return true;
}
}
class ConcreteHandler2 extends ChainHandler {
protected canHandleRequest(request: Request): boolean {
return request.type === 'B';
}
protected processRequest(request: Request): boolean {
console.log('Handling request with ConcreteHandler2');
return true;
}
}
const handler1 = new ConcreteHandler1();
const handler2 = new ConcreteHandler2();
handler1.setNext(handler2);
handler1.handle({ type: 'A' });
优缺点
优点
- 可以避免请求发送者与多个接受者耦合在一起;
- 可以动态地新增或者删除责任。
缺点
- 调试会比较困难,尤其是链条比较长的时候;
- 可能存在过多的请求没有被处理的情况。
使用场景
应用场合在于“一个请求可能有多个接受者,但是最后真正的接受者只有一个”,这时候请求发送者与接受者的耦合有可能出现“变化脆弱”的症状,职责链的目的就是将二者解耦,从而更好地应对变化。