TypeScript设计模式(13):责任链模式

72 阅读2分钟

责任链模式(Chain of Responsibility)

概述

责任链模式(Chain of Responsibility)是一种行为设计模式,它允许多个处理器对象依次处理请求。通过将请求沿着处理者链传递,责任链模式可以降低对象之间的耦合性,提高系统的可扩展性。

在 TypeScript 中,我们可以利用接口、抽象类等特性来实现责任链模式,使其更加清晰易懂。

适用场景

  • 当有多个对象可以处理请求,但具体由哪个对象处理并不确定时。
  • 需要动态指定请求处理顺序时。
  • 希望减少对象之间的耦合关系。

代码实现

下面是一个使用 TypeScript 实现的责任链模式示例。假设我们有一个日志记录系统,它可以按不同的级别(INFOWARNERROR)处理日志信息。

// 定义日志级别
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.");

代码解析

  1. Logger 抽象类:定义了 setNext 方法来设置下一个处理者,并提供 log 方法进行请求传递。
  2. InfoLoggerWarnLoggerErrorLogger:具体的日志处理者,实现 handle 方法处理不同级别的日志。
  3. 责任链的组装:创建 InfoLogger 作为起点,并依次添加 WarnLoggerErrorLogger
  4. 日志处理流程
    • INFO 级别的日志只由 InfoLogger 处理。
    • WARN 级别的日志由 WarnLogger 处理。
    • ERROR 级别的日志由 ErrorLogger 处理。

总结

责任链模式通过创建一系列相互连接的处理者对象,使请求在链上传递,直到被某个处理者处理。这种模式在日志系统、权限校验、请求拦截等场景中非常实用。

使用 TypeScript 实现责任链模式,可以让代码更加模块化、可扩展,符合面向对象设计原则,提高代码的可读性和复用性。