本文共 2159 字,大约阅读时间需要 7 分钟。
为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推
责任链中,所有的处理者,都加入到这个链式中,一个处理完完毕后,转给下一个
步骤
典型代表
Filter过滤器、Interceptor拦截器责任接口:
public interface Responsibility { void process(Request request, ResponsibilityChain chain);}
责任实现类A:
public class ResponsibilityA implements Responsibility { @Override public void process(Request request, ResponsibilityChain chain) { System.out.println("Responsibility-A do something..."); chain.process(request); }}
责任实现类B:
public class ResponsibilityB implements Responsibility { @Override public void process(Request request, ResponsibilityChain chain) { System.out.println("Responsibility-B do something..."); chain.process(request); }}
责任链:
public class ResponsibilityChain { private Listresponsibilitys; private int index = 0; public ResponsibilityChain() { this.responsibilitys = new ArrayList<>(); } /** * 责任链处理 * @param request */ public void process(Request request) { if (this.index < this.responsibilitys.size()) { //允许前置处理 System.out.println("这里可以做一些前置处理"); this.responsibilitys.get(index++).process(request, this); //允许后置处理 System.out.println("这里可以做一些后置处理"); } } /** * 注册责任链 * @param res */ public void register(Responsibility res) { this.responsibilitys.add(res); }}
传输的实体类:
public interface Request { }
测试类:
public class ResponsibilityMain { public static void main(String[] args) { ResponsibilityChain chain = new ResponsibilityChain(); chain.register(new ResponsibilityA()); chain.register(new ResponsibilityB()); chain.process(new Request() { }); }}
测试结果
这里可以做一些前置处理Responsibility-A do something...这里可以做一些前置处理Responsibility-B do something...这里可以做一些后置处理这里可以做一些后置处理
责任链模式和装饰者模式完成的是相同的事情
责任链模式调用的方式是链式调用,整个链条的调用方式分为如下:
- 进入:A–>B–>C
- 退出:C–>B–>A
这种链式调用的方式和事务管理中的代理TransactionInterceptor.invoke一模一样
缺点是效率会比较低
转载地址:http://iwpxi.baihongyu.com/