Java设计模式之责任链模式 Java实现责任链 Spring实现责任链

简介:

责任链模式:一次请求的调用,需要责任链中的一个或多个协助处理,依次经过调用责任链对象。(可以控制执行顺序)

例如:过滤器、拦截器等

java的实现方式:

  •  定义一个过滤链接口,所有chain都实现这个接口
public interface ChainFilter {

    void doFilter(ChainFilter chainFilter);

}
  •  定义链的具体实现
public class ChainA implements ChainFilter {
    @Override
    public void doFilter(ChainFilter fraudPreventionFilter) {
        System.out.println("AAA");
        fraudPreventionFilter.doFilter(fraudPreventionFilter);
    }
}


public class ChainB implements ChainFilter {
    @Override
    public void doFilter(ChainFilter fraudPreventionFilter) {
        System.out.println("BBB");
        fraudPreventionFilter.doFilter(fraudPreventionFilter);
    }
}
  • 定义一个执行器,用来连接各个chain,有很多种方法,可以递归、for循环等
public class ChainProcessor implements ChainFilter {

    private int counter = 0;

    private List<ChainFilter> chainFilters;

    public ChainProcessor() {
    }

    public ChainProcessor(int counter, List<ChainFilter> fraudPreventionFilters) {
        this.counter = counter;
        this.chainFilters = fraudPreventionFilters;
    }

    public void addFilter(ChainFilter chainFilter) {
        if (chainFilters == null) {
            chainFilters = new ArrayList<>();
        }
        chainFilters.add(chainFilter);
    }

    @Override
    public void doFilter(ChainFilter chainFilter) {
        if (counter == chainFilters.size()) {
            return;
        }
        chainFilters.get(counter++).doFilter(chainFilter);
    }

    /**
     * 测试
     * @param args
     */
    public static void main(String[] args) {
        ChainProcessor chainProcessor = new ChainProcessor();
        chainProcessor.addFilter(new ChainA());
        chainProcessor.addFilter(new ChainB());
        chainProcessor.addFilter(new ChainB());
        chainProcessor.addFilter(new ChainB());
        chainProcessor.doFilter(chainProcessor);
    }
}

Spring的实现方式:

  •  定义一个过滤链接口,所有chain都实现这个接口
public interface ChainFilter {

    void doFilter();

}
  •  定义链的具体实现
@Order(1)
@Component
public class ChainA implements ChainFilter {
    @Override
    public void doFilter() {
        System.out.println("Spring A");
    }
}


@Order(2)
@Component
public class ChainB implements ChainFilter {
    @Override
    public void doFilter() {
        System.out.println("Spring B");
    }
}
  • 定义一个执行器
@Component
public class ChainProcessor {

    @Autowired
    private List<ChainFilter> chainFilters;

    public ChainProcessor() {
    }

    public ChainProcessor(List<ChainFilter> chainFilters) {
        this.chainFilters = chainFilters;
    }

    public void execute() {
        for (ChainFilter chainFilter : chainFilters) {
            chainFilter.doFilter();
        }
    }

}
  • 执行责任链
@Autowired
private ChainProcessor chainProcessor;

chainProcessor.execute();


版权声明:本文为cenjianteng原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。