责任链模式(Chain of Responsibility)
概述
责任链模式(Chain of Responsibility)是一种行为设计模式,它允许多个处理器对象依次处理请求。通过将请求沿着处理者链传递,责任链模式可以降低对象之间的耦合性,提高系统的可扩展性。
在 TypeScript 中,我们可以利用接口、抽象类等特性来实现责任链模式,使其更加清晰易懂。
适用场景
- 当有多个对象可以处理请求,但具体由哪个对象处理并不确定时。
- 需要动态指定请求处理顺序时。
- 希望减少对象之间的耦合关系。
代码实现
下面是一个使用 TypeScript 实现的责任链模式示例。假设我们有一个日志记录系统,它可以按不同的级别(INFO、WARN、ERROR)处理日志信息。
// 定义日志级别
enum LogLevel {
INFO,
WARN,
ERROR
}
// 处理者接口
abstract class Logger {
protected nextLogger: Logger | null = null;
setNext(logger: Logger): Logger {
this.nextLogger = logger;
return logger; // 支持链式调用
}
log(level: LogLevel, message: string): void {
if (this.handle(level, message) && this.nextLogger) {
this.nextLogger.log(level, message);
}
}
protected abstract handle(level: LogLevel, message: string): boolean;
}
// 具体处理者 - 处理 INFO 级别日志
class InfoLogger extends Logger {
protected handle(level: LogLevel, message: string): boolean {
if (level === LogLevel.INFO) {
console.log(`[INFO]: ${message}`);
return false; // 终止传播
}
return true; // 继续传播
}
}
// 具体处理者 - 处理 WARN 级别日志
class WarnLogger extends Logger {
protected handle(level: LogLevel, message: string): boolean {
if (level === LogLevel.WARN) {
console.warn(`[WARN]: ${message}`);
return false;
}
return true;
}
}
// 具体处理者 - 处理 ERROR 级别日志
class ErrorLogger extends Logger {
protected handle(level: LogLevel, message: string): boolean {
if (level === LogLevel.ERROR) {
console.error(`[ERROR]: ${message}`);
return false;
}
return true;
}
}
// 组装责任链
const loggerChain = new InfoLogger();
loggerChain.setNext(new WarnLogger()).setNext(new ErrorLogger());
// 测试日志处理
loggerChain.log(LogLevel.INFO, "This is an info message.");
loggerChain.log(LogLevel.WARN, "This is a warning message.");
loggerChain.log(LogLevel.ERROR, "This is an error message.");
代码解析
Logger抽象类:定义了setNext方法来设置下一个处理者,并提供log方法进行请求传递。InfoLogger、WarnLogger、ErrorLogger:具体的日志处理者,实现handle方法处理不同级别的日志。- 责任链的组装:创建
InfoLogger作为起点,并依次添加WarnLogger和ErrorLogger。 - 日志处理流程:
INFO级别的日志只由InfoLogger处理。WARN级别的日志由WarnLogger处理。ERROR级别的日志由ErrorLogger处理。
总结
责任链模式通过创建一系列相互连接的处理者对象,使请求在链上传递,直到被某个处理者处理。这种模式在日志系统、权限校验、请求拦截等场景中非常实用。
使用 TypeScript 实现责任链模式,可以让代码更加模块化、可扩展,符合面向对象设计原则,提高代码的可读性和复用性。