描述

责任链(Chain of Responsibility)模式:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。属于对象行为型模式
image.png

主要角色

  • 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
  • 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
  • 客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

代码实现

回旋责任链 链式递归

  1. public interface Filter {
  2. void doFilter(R res,RS resp,FilterChain chain);
  3. }
  1. public class CharacterFilter implements Filter
  2. {
  3. @Override
  4. public void doFilter(R res, RS resp, FilterChain chain) {
  5. System.out.println("1");
  6. chain.doFilter(res,resp,chain);
  7. System.out.println("1+1");
  8. }
  9. }
public class CompetenceFilter implements Filter{
    @Override
    public void doFilter(R res, RS resp, FilterChain chain) {
        System.out.println("2");
        chain.doFilter(res,resp,chain);
        System.out.println("2+2");
    }
}
public class FilterChain implements Filter{
    private List<Filter> filters = new ArrayList<>();

    private int cursor = 0;

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

    @Override
    public void doFilter(R res, RS resp, FilterChain chain) {

        if(cursor == filters.size()){
            return;
        }
        Filter filter = filters.get(cursor);
        cursor++;
        filter.doFilter(res,resp,chain);


    }

}
public class Test {
    public static void main(String[] args) {

        FilterChain filterChain = new FilterChain();
        CharacterFilter characterFilter = new CharacterFilter();
        CompetenceFilter competenceFilter = new CompetenceFilter();

        filterChain.addFilter(characterFilter);
        filterChain.addFilter(competenceFilter);

        filterChain.doFilter(new R(),new RS(),filterChain);

    }
}
//测试结果
1
2
2+2
1+1

使用场景

什么场景用到?Tomcat的Pipeline、ValveFilter链Aop责任链……