【设计模式系列】责任链模式(十六)

一、什么是责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式。其核心思想是将请求的发送者和接收者解耦,通过一个中介链来传递请求,使得多个对象都有可能接收请求,从而避免请求发送者和接收者之间的耦合关系。

二、责任链模式的角色

  1. 抽象处理者(Handler)角色:作为责任链模式的核心,这个接口定义了统一的处理请求的方法,并定义了如何将请求传递给下一个处理者。

  2. 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求。如果可以处理请求,则直接处理;否则,将请求传递给下一个处理者。

三、责任链模式的典型应用

  1. 多层拦截器:在Web开发中,可以使用责任链模式来实现多层拦截器,每个拦截器都可以对请求进行预处理或后处理,实现多层拦截的功能 。

  2. 可改变顺序的处理者:必须按顺序执行多个处理者,尤其在运行时执行顺序可改变时,可以使用责任链模式。

  3. 多个对象可以处理请求:当系统中存在多个对象,每个对象都可能处理同一个请求,但具体由哪个对象处理应在运行时决定。

  4. 避免复杂的条件判断:当请求需要根据多个条件进行不同的处理,可以使用责任链模式,避免使用嵌套的if-else语句,使代码更加简洁易读。

四、责任链模式在FilterChain中的应用

责任链模式在FilterChain中的应用是Java Servlet API中一个经典的例子。在这种应用中,每个过滤器(Filter)都有机会处理HTTP请求,并且可以决定是否将请求传递给链中的下一个过滤器或目标资源。以下是每个类在责任链模式中的角色以及一个简单的代码案例

  1. 抽象处理者(Handler)

    • FilterChain中,Filter接口扮演了抽象处理者的角色。它定义了所有过滤器必须实现的doFilter方法,该方法接收请求(ServletRequest)、响应(ServletResponse)和一个FilterChain实例 。
  2. 具体处理者(Concrete Handler)

    • 具体过滤器类实现了Filter接口。在doFilter方法中,每个过滤器可以对请求和响应进行处理,然后通过调用FilterChaindoFilter方法将请求传递给链中的下一个过滤器 。
  3. 客户端(Client)

    • 在这个上下文中,客户端可以是任何发起HTTP请求的实体,如Web浏览器。客户端发送请求到Servlet容器,该容器负责构建过滤器链并处理请求 。
  4. FilterChain(责任链)

    • FilterChain接口定义了doFilter方法,用于调用链中的下一个过滤器或最终的资源(如Servlet)。FilterChain的实现类负责管理过滤器链的执行顺序 。

以下是一个简单的代码案例,展示了两个过滤器如何在FilterChain中按顺序工作 :

1.定义第一个过滤器:LoggingFilter

java 复制代码
public class LoggingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("LoggingFilter 初始化");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("LoggingFilter: 请求开始...");
        // 执行下一个过滤器或目标资源
        chain.doFilter(request, response);
        System.out.println("LoggingFilter: 响应返回...");
    }

    @Override
    public void destroy() {
        System.out.println("LoggingFilter 销毁");
    }
}

2.定义第二个过滤器:AuthenticationFilter

java 复制代码
public class AuthenticationFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("AuthenticationFilter 初始化");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        Cookie[] cookies = httpRequest.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                System.out.println("Found cookie: " + cookie.getName() + "=" + cookie.getValue());
            }
        }
        // 继续执行过滤器链
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        System.out.println("AuthenticationFilter 销毁");
    }
}

3.定义目标资源:DemoServlet

java 复制代码
public class DemoServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("DemoServlet: 处理请求...");
        resp.getWriter().write("Hello, FilterChain!");
    }
}

在这个例子中,LoggingFilterAuthenticationFilter是具体处理者,它们实现了Filter接口,并在doFilter方法中处理请求。FilterChain的实例通过chain.doFilter(request, response)调用传递请求给下一个过滤器或最终的Servlet资源。当访问DemoServlet时,过滤器链将按顺序执行,首先执行LoggingFilter,然后是AuthenticationFilter,最后是DemoServlet处理请求 。

相关推荐
都叫我大帅哥35 分钟前
深入浅出 Resilience4j:Java 微服务的“免疫系统”实战指南
java·spring cloud
Cao_Shixin攻城狮3 小时前
Flutter运行Android项目时显示java版本不兼容(Unsupported class file major version 65)的处理
android·java·flutter
Dcs5 小时前
还在用 Arrays.hashCode?Java 自己也能写出更快的版本!
java
fouryears_234177 小时前
Spring,Spring Boot 和 Spring MVC 的关系以及区别
java·spring boot·spring·mvc
阿葱(聪)8 小时前
java 在k8s中的部署流程
java·开发语言·docker·kubernetes
浮生带你学Java8 小时前
2025Java面试题及答案整理( 2025年 7 月最新版,持续更新)
java·开发语言·数据库·面试·职场和发展
板板正8 小时前
SpringAI——提示词(Prompt)、提示词模板(PromptTemplate)
java·spring boot·ai·prompt
板板正8 小时前
SpringAI——对话记忆
java·spring boot·ai
期待のcode8 小时前
图片上传实现
java·前端·javascript·数据库·servlet·交互
李长渊哦9 小时前
深入理解Java中的Map.Entry接口
java·开发语言