编程设计模式之责任链模式

编程设计模式之责任链模式

为什么有责任链模式?

在软件开发中,经常会遇到需要处理一系列相似但不完全相同的请求或事件的情况。如果每个请求都由单独的逻辑处理,会导致代码重复和耦合度增加。责任链模式就是为了解决这一问题而诞生的。

责任链模式的设计思路

责任链模式的核心思想是将请求或事件的处理者组织成一条链,并在接收到请求时,沿着这条链逐个处理,直到有一个处理者能够处理该请求为止。

责任链模式包含三个主要角色:

  1. Handler(处理者):定义了处理请求的接口,并维护了一个对下一个处理者的引用。
  2. ConcreteHandler(具体处理者):实现了处理请求的具体逻辑,如果自己不能处理该请求,则将请求传递给下一个处理者。
  3. Client(客户端):创建责任链并将请求发送给责任链的头部。

Java示例代码

下面是一个简单的Java示例代码,演示了责任链模式的应用:

java 复制代码
// 处理请求的接口
interface Handler {
    void handleRequest(int request);
}

// 具体处理者A
class ConcreteHandlerA implements Handler {
    private Handler nextHandler;

    public ConcreteHandlerA(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleRequest(int request) {
        if (request < 10) {
            System.out.println("ConcreteHandlerA 处理请求:" + request);
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

// 具体处理者B
class ConcreteHandlerB implements Handler {
    private Handler nextHandler;

    public ConcreteHandlerB(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleRequest(int request) {
        if (request < 20) {
            System.out.println("ConcreteHandlerB 处理请求:" + request);
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

// 客户端代码
public class Main {
    public static void main(String[] args) {
        // 创建具体处理者
        Handler handlerA = new ConcreteHandlerA(null);
        Handler handlerB = new ConcreteHandlerB(handlerA);

        // 发送请求给责任链的头部
        handlerB.handleRequest(5);
        handlerB.handleRequest(15);
        handlerB.handleRequest(25);
    }
}

在这个示例中,请求会从责任链的头部(ConcreteHandlerB)开始传递,如果某个处理者能够处理该请求,则直接处理;否则,将请求传递给下一个处理者,直到有一个处理者能够处理为止。

SpringBoot工程中如何应用责任链模式

在SpringBoot工程中,我们可以使用责任链模式来处理一系列的拦截器或过滤器,例如HTTP请求的拦截器链。

首先,定义处理请求的接口:

java 复制代码
// HTTP请求处理接口
public interface RequestHandler {
    void handleRequest(HttpServletRequest request, HttpServletResponse response, RequestHandlerChain chain);
}

// 请求处理链
public interface RequestHandlerChain {
    void doHandle(HttpServletRequest request, HttpServletResponse response);
}

然后,实现具体的处理者:

java 复制代码
// HTTP请求日志记录处理者
@Component
public class HttpRequestLoggingHandler implements RequestHandler {
    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response, RequestHandlerChain chain) {
        System.out.println("记录HTTP请求日志");
        chain.doHandle(request, response);
    }
}

// 权限验证处理者
@Component
public class AuthenticationHandler implements RequestHandler {
    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response, RequestHandlerChain chain) {
        System.out.println("进行权限验证");
        chain.doHandle(request, response);
    }
}

最后,在配置类中将处理者组织成责任链:

java 复制代码
@Configuration
public class RequestHandlerConfig {
    @Autowired
    private List<RequestHandler> requestHandlers;

    @Bean
    public RequestHandlerChain requestHandlerChain() {
        RequestHandlerChain chain = new RequestHandlerChain() {
            private Iterator<RequestHandler> iterator = requestHandlers.iterator();

            @Override
            public void doHandle(HttpServletRequest request, HttpServletResponse response) {
                if (iterator.hasNext()) {
                    iterator.next().handleRequest(request, response, this);
                }
            }
        };
        return chain;
    }
}

通过这种方式,在SpringBoot工程中,我们可以方便地构建出一个HTTP请求处理的责任链,每个请求会依次经过责任链中的处理者,直到有一个处理者能够处理该请求为止。

相关推荐
程序员码歌23 分钟前
短思考第266天,玩IP路上的几点感悟,这几点很重要!
前端·后端·创业
码农BookSea28 分钟前
响应式编程不只有概念!万字长文 + 代码示例,手把手带你玩转 RxJava
后端
毕设源码-郭学长41 分钟前
【开题答辩全过程】以 基于SpringBoot的足球运动员训练计划管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
海南java第二人44 分钟前
Spring Boot自定义注解深度解析:从入门到实战进阶
java·spring boot·后端
qq_12498707531 小时前
悦读圈图书共享微信小程序(源码+论文+部署+安装)
spring boot·后端·微信小程序·小程序·毕业设计·计算机毕业设计
韩立学长1 小时前
【开题答辩实录分享】以《基于springboot洗衣店管理系统的设计与实现》为例进行选题答辩实录分享
java·spring boot·后端
时光追逐者1 小时前
ASP.NET Core 依赖注入的三种服务生命周期
后端·c#·asp.net·.net·.netcore
毕设源码-朱学姐1 小时前
【开题答辩全过程】以 基于SpringBoot的智慧商城系统设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
JaguarJack1 小时前
前后端分离框架 CatchAdmin V5 beta.2 发布 插件化与开发效率的进一步提升
后端·php·laravel
BingoGo1 小时前
前后端分离框架 CatchAdmin V5 beta.2 发布 插件化与开发效率的进一步提升
后端·开源·php