Loading...

Java设计模式(12)责任链模式

前言

Java开发中,设计模式是常用的一种编码方式,合理使用设计模式可以帮助开发人员更快地编写出高效、可靠和可维护的代码。本期将撰写一个关于设计模式的系列文章,总共23种设计模式将以一篇一篇文章讲解,代码笔记已开源至:Gitee点击跳转。在上一篇《Java设计模式(11)组合模式》文章中,我们介绍了组合模式。本文是这个系列的第十二篇章,我们将讲解一下责任链模式的实现方式、应用场景以及它的用途。

责任链模式

责任链模式是一种行为型设计模式,它允许多个对象来处理请求,并且将这些对象连成一条链。链中的每个处理者(处理对象)都包含对下一个处理者的引用,如果当前处理者无法处理该请求,则会将请求传递给下一个处理者,直到链条的末端。

使用场景

  • 请求的多级处理:需要对请求进行多级处理,直到有对象能够处理请求。
  • 审批流程:如企业中的请假审批、报销流程等,需要经过多个审批层次。
  • 异常处理链:系统或应用程序中,多个模块处理异常的场景。

代码实现

这里使用简易的http 处理框架来简单实现一下这个模式。首先是过滤(Filter)接口,里面有一个doFilter(),接收三个参数Request、Response、FilterChain

/**
 * 过滤器接口
 * @author Jensen
 * @date 2024-04-17
 * */
public interface Filter {
    void doFilter(Request request, Response response, FilterChain chain);
}

RequestResponse是两个空类,这里是假设它俩是真实的请求和响应

public class Request { }
public class Response { }

FilterChain是整个链的核心,它是链路的处理者,因为它持有所有的过滤器

/**
 * 过滤链路
 * @author Jensen
 * @date 2024-04-17
 * */
public class FilterChain {
    private final List<Filter> filters = new ArrayList<>();
    private int index = 0;

    public void addFilter(Filter filter) {
        filters.add(filter);
    }

    public void doFilter(Request request, Response response) {
        if (index == filters.size()) {
            return;
        }
        Filter filter = filters.get(index);
        index++;
        filter.doFilter(request, response, this);
    }
}

最后是三个过滤器(FilterAFilterBFilterC)组合实现于它并形成一条链路,每个过滤器都有它自己的处理逻辑,无论是否处理都会提交到下一个过滤器处理

/**
 * 过滤器A
 * @author Jensen
 * @date 2024-04-17
 * */
public class FilterA implements Filter {
    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {
        System.out.println("过滤器A处理");
        chain.doFilter(request,response);
    }
}
/**
 * 过滤器B
 * @author Jensen
 * @date 2024-04-17
 * */
public class FilterB implements Filter {
    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {
        System.out.println("过滤器B处理");
        chain.doFilter(request,response);
    }
}
/**
 * 过滤器C
 * @author Jensen
 * @date 2024-04-17
 * */
public class FilterC implements Filter {
    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {
        System.out.println("过滤器C处理");
        chain.doFilter(request,response);
    }
}

测试使用

我们在main函数中实现一下这个简易的http过滤器😅

System.out.println("------------------------------责任链模式-----------------------------");
Request request = new Request();
Response response = new Response();
FilterChain filterChain = new FilterChain();
filterChain.addFilter(new FilterA());
filterChain.addFilter(new FilterB());
filterChain.addFilter(new FilterC());
filterChain.doFilter(request,response);

输出:

image.png

结语

责任链模式在Java中比较经典的应用就是:Servlet框架中,请求被 Servlet 容器传递给过滤器链,每个过滤器都可以对请求进行处理,如果需要将请求传递给下一个过滤器,则需要调用chain.doFilter()方法,直到最终到达Servlet为止。

责任链模式通过将请求沿着处理者链条传递,实现了请求的灵活处理。在多级审批、任务处理、异常处理等场景中,合理使用责任链模式可以降低耦合度,增强灵活性,并且也是符合开闭原则。

0

回到顶部