设计模式深度解析:职责链模式(Chain of Responsibility Pattern)及其应用实践

103 阅读2分钟

设计模式深度解析:职责链模式(Chain of Responsibility Pattern)及其应用实践

什么是职责链模式?

职责链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许你将请求沿着处理链传递,直到有一个处理者能够处理该请求。这种模式解耦了请求的发送者和接收者,使得多个对象都有机会处理请求。

核心概念

  1. 处理者(Handler):定义处理请求的接口,通常包含一个指向下一个处理者的引用。
  2. 具体处理者(Concrete Handler):实现处理请求的具体逻辑,如果不能处理则传递给下一个处理者。
  3. 客户端(Client):初始化请求并将其发送到链的第一个处理者。

代码示例

以下是一个简单的职责链模式实现,模拟一个日志记录系统,不同级别的日志由不同的处理者处理:

// 抽象处理者
abstract class Logger {
    public static int INFO = 1;
    public static int DEBUG = 2;
    public static int ERROR = 3;

    protected int level;
    protected Logger nextLogger;

    public void setNextLogger(Logger nextLogger) {
        this.nextLogger = nextLogger;
    }

    public void logMessage(int level, String message) {
        if (this.level <= level) {
            write(message);
        }
        if (nextLogger != null) {
            nextLogger.logMessage(level, message);
        }
    }

    abstract protected void write(String message);
}

// 具体处理者:控制台日志
class ConsoleLogger extends Logger {
    public ConsoleLogger(int level) {
        this.level = level;
    }

    @Override
    protected void write(String message) {
        System.out.println("Console Logger: " + message);
    }
}

// 具体处理者:文件日志
class FileLogger extends Logger {
    public FileLogger(int level) {
        this.level = level;
    }

    @Override
    protected void write(String message) {
        System.out.println("File Logger: " + message);
    }
}

// 具体处理者:错误日志
class ErrorLogger extends Logger {
    public ErrorLogger(int level) {
        this.level = level;
    }

    @Override
    protected void write(String message) {
        System.out.println("Error Logger: " + message);
    }
}

// 客户端代码
public class ChainPatternDemo {
    public static void main(String[] args) {
        Logger consoleLogger = new ConsoleLogger(Logger.INFO);
        Logger fileLogger = new FileLogger(Logger.DEBUG);
        Logger errorLogger = new ErrorLogger(Logger.ERROR);

        consoleLogger.setNextLogger(fileLogger);
        fileLogger.setNextLogger(errorLogger);

        consoleLogger.logMessage(Logger.INFO, "This is an information.");
        consoleLogger.logMessage(Logger.DEBUG, "This is a debug level information.");
        consoleLogger.logMessage(Logger.ERROR, "This is an error information.");
    }
}

应用场景:审批流程

职责链模式非常适合用于审批流程,例如请假审批:

  1. 普通员工:请假1天内直接批准。
  2. 部门经理:请假3天内批准。
  3. 总经理:请假7天内批准。
  4. 董事会:请假超过7天需董事会审批。

通过职责链模式,可以灵活地扩展审批流程,而无需修改现有代码。

总结

职责链模式通过解耦请求的发送者和接收者,提高了系统的灵活性和可扩展性。它适用于多级处理或动态指定处理者的场景。