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

一、什么是责任链模式

责任链模式(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处理请求 。

相关推荐
可儿·四系桜16 分钟前
WebSocket:实时通信的新时代
java·网络·websocket·网络协议
forestsea16 分钟前
Maven 插件机制与生命周期管理
java·maven
七月在野,八月在宇,九月在户25 分钟前
maven 依赖冲突异常分析
java·maven
金融数据出海33 分钟前
黄金、碳排放期货市场API接口文档
java·开发语言·spring boot·后端·金融·区块链
胡斌附体38 分钟前
微服务中 本地启动 springboot 无法找到nacos配置 启动报错
java·spring boot·微服务·yml·naocs yml
薯条不要番茄酱1 小时前
【JVM】从零开始深度解析JVM
java·jvm
夏季疯1 小时前
学习笔记:黑马程序员JavaWeb开发教程(2025.3.31)
java·笔记·学习
yangyang_z1 小时前
【C++设计模式之Observer观察者模式】
c++·观察者模式·设计模式
D_aniel_1 小时前
排序算法-快速排序
java·排序算法·快速排序
长安城没有风1 小时前
数据结构 集合类与复杂度
java·数据结构