Java设计模式之责任链 (Chain of Responsibility)模式

责任链(Chain of Responsibility)模式可以将多个处理对象组成一条责任链,然后按照顺序逐个处理请求,直到有对象处理完成为止。

什么是责任链模式

责任链模式可以将请求发送者与接收者解耦,避免请求发送者与接收者之间的耦合。该模式中,请求沿着责任链依次传递,直到有一个对象处理请求为止。责任链模式的核心是定义责任链节点的接口以及节点之间的关系,它允许动态的增加和修改责任链中的节点。

责任链模式的使用场景

适用于需要动态地处理请求,并且希望将请求发送者和接收者解耦的场景,例如日志记录、异常处理、权限验证等。

责任链模式的代码示例

下面我们以日志记录为例来演示责任链模式的实现。

// 定义一个抽象的日志处理器
public abstract class LoggerHandler {
    protected int level;
    protected LoggerHandler nextHandler;

    public void setNextHandler(LoggerHandler handler) {
        this.nextHandler = handler;
    }

    // 处理日志信息
    public void log(int level, String message) {
        if (this.level <= level) {
            write(message);
        }
        if (nextHandler != null) {
            nextHandler.log(level, message);
        }
    }

    // 定义具体的日志处理方法
    protected abstract void write(String message);
}

// 定义控制台日志处理器
public class ConsoleLoggerHandler extends LoggerHandler {
    public ConsoleLoggerHandler(int level) {
        this.level = level;
    }

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

// 定义文件日志处理器
public class FileLoggerHandler extends LoggerHandler {
    public FileLoggerHandler(int level) {
        this.level = level;
    }

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

// 定义错误日志过滤器
public class ErrorLoggerFilter extends LoggerHandler {
    public ErrorLoggerFilter(int level) {
        this.level = level;
    }

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

// 责任链处理器的使用
public class LoggerHandlerDemo {
    public static void main(String[] args) {
        LoggerHandler loggerHandlerChain = getLogHandlers();
        loggerHandlerChain.log(LoggerHandler.INFO, "This is an information.");
        loggerHandlerChain.log(LoggerHandler.DEBUG, "This is a debug level information.");
        loggerHandlerChain.log(LoggerHandler.ERROR, "This is an error information.");
    }

    private static LoggerHandler getLogHandlers() {
        LoggerHandler errorLoggerFilter = new ErrorLoggerFilter(LoggerHandler.ERROR);
        LoggerHandler fileLoggerHandler = new FileLoggerHandler(LoggerHandler.DEBUG);
        LoggerHandler consoleLoggerHandler = new ConsoleLoggerHandler(LoggerHandler.INFO);

        errorLoggerFilter.setNextHandler(fileLoggerHandler);
        fileLoggerHandler.setNextHandler(consoleLoggerHandler);

        return errorLoggerFilter;
    }
}

以上就是责任链模式在日志记录中的示例代码。在该示例中,我们首先定义了一个抽象的日志处理器,然后定义了控制台日志处理器、文件日志处理器以及错误日志过滤器。最后,我们将这些处理器组合成一个责任链,按顺序处理日志信息。

运行结果如下:

Error Console::Logger: This is an error information.
File::Logger: This is a debug level information.
Standard Console::Logger: This is an information.

责任链模式的实际应用

以下是一些常用框架和工具,它们都采用了责任链模式:

  1. Spring框架中的拦截器:拦截器是Spring框架中的一种常见组件,它可以在请求处理前后进行一些额外的处理,例如身份验证、日志记录、权限控制等。拦截器就是利用了责任链模式来将多个处理对象构成一条拦截器链,然后逐个处理请求。Spring框架提供了很多拦截器,例如HandlerInterceptor、WebRequestInterceptor等。

  2. Servlet中的过滤器:Servlet中的过滤器也是一种常见的使用责任链模式的场景。过滤器可以在请求处理前后进行一些额外的处理,例如安全认证、数据预处理、异常处理等。

  3. Java 8中的Lambda表达式:Java 8中的Lambda表达式可以看作是一种函数式接口,它利用责任链模式来组合、封装和传递函数对象。Lambda表达式可以通过链式结构形成一个函数的序列,然后按顺序逐个执行这些函数并返回结果,从而可以在Java中实现函数式编程。

  4. Netty中的处理器Pipeline:Netty是一种基于事件驱动的网络通信框架,它利用责任链模式和事件监听机制来处理请求。Netty中的处理器Pipeline是一条处理请求的链,该链中的每个处理器都可以对请求进行处理和传递,从而形成一个完整的事件处理流程。

关注微信公众号:“小虎哥的技术博客”。我们会定期发布关于Java技术的详尽文章,让您能够深入了解该领域的各种技巧和方法,让我们一起成为更优秀的程序员👩‍💻👨‍💻!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小虎哥的技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值