侧边栏壁纸
博主头像
拾荒的小海螺博主等级

只有想不到的,没有做不到的

  • 累计撰写 224 篇文章
  • 累计创建 19 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

JAVA:责任链模式(Chain of Responsibility Pattern)的技术指南

拾荒的小海螺
2025-03-04 / 0 评论 / 0 点赞 / 14 阅读 / 5256 字

1、简述

责任链模式是一种行为型设计模式,用于通过将请求沿着一条链传递来处理请求,直到链上的某个处理者能够处理它为止。该模式能够动态地组织多个处理对象,避免请求发送者和接收者之间的直接耦合。

本文将详细介绍责任链模式的概念、结构、优缺点以及实际应用案例。

image-govs.png

设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git


2、 什么是责任链模式?

责任链模式的核心思想是将请求的发送者与接收者解耦,允许多个对象都有机会处理请求。这些对象被连接成一条链,并沿着链传递请求,直到某个对象处理完成或链结束。

典型的例子包括:

  • 审批流程中的层级审批。
  • Web 应用中的过滤器链。
  • 日志记录器(Logger)的多级别处理。

责任链模式包含以下角色:

  • 处理者(Handler):定义处理请求的接口,并可选择将请求传递给下一个处理者。
  • 具体处理者(ConcreteHandler):实现处理者接口,处理请求或将其传递给下一个处理者。
  • 客户端(Client):创建链并发送请求。

类图如下:

Handler <--- ConcreteHandler1
   |                      |
   +-------> ConcreteHandler2

3、实际案例

假设我们需要实现一个日志记录器系统,不同的日志级别由不同的记录器处理,例如 DEBUG、INFO 和 ERROR。我们可以使用责任链模式来实现。

// 抽象处理者
public abstract class Logger {
    public static int DEBUG = 1;
    public static int INFO = 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);
        }
    }

    protected abstract void write(String message);
}

// 具体处理者
public class ConsoleLogger extends Logger {
    public ConsoleLogger(int level) {
        this.level = level;
    }

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

public class FileLogger extends Logger {
    public FileLogger(int level) {
        this.level = level;
    }

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

public 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 ChainOfResponsibilityDemo {
    private static Logger getChainOfLoggers() {
        Logger errorLogger = new ErrorLogger(Logger.ERROR);
        Logger fileLogger = new FileLogger(Logger.INFO);
        Logger consoleLogger = new ConsoleLogger(Logger.DEBUG);

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

        return errorLogger;
    }

    public static void main(String[] args) {
        Logger loggerChain = getChainOfLoggers();

        loggerChain.logMessage(Logger.DEBUG, "This is a DEBUG level message.");
        loggerChain.logMessage(Logger.INFO, "This is an INFO level message.");
        loggerChain.logMessage(Logger.ERROR, "This is an ERROR level message.");
    }
}

输出:

Console Logger: This is a DEBUG level message.
File Logger: This is an INFO level message.
Console Logger: This is an INFO level message.
Error Logger: This is an ERROR level message.
File Logger: This is an ERROR level message.
Console Logger: This is an ERROR level message.

4、责任链模式的优缺点

优点

  • 解耦:发送者与接收者之间解耦,增强系统的灵活性。
  • 灵活性:可以动态地添加或删除处理者。
  • 单一职责原则:每个处理者只专注于处理自己负责的请求。

缺点

  • 请求无保证处理:如果链上的处理者都不能处理请求,可能导致请求丢失。
  • 调试困难:链的动态性可能增加调试的复杂性。

5. 应用场景

  • 审批流:如报销单的逐级审批。
  • 日志处理:不同级别的日志由不同的处理器处理。
  • 过滤器链:如 Web 应用中的请求过滤。

6、总结

责任链模式提供了一种灵活的请求处理方式,通过将多个处理者串联成链,避免了请求发送者与接收者之间的耦合。其在复杂的业务场景中表现出色,尤其是需要动态调整处理逻辑的场景。

希望本文对您理解和应用责任链模式有所帮助!欢迎交流讨论!

0

评论区