责任链定义
使多个对象都有处理请求的机会,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象串成一条链,并沿着这条链一直传递该请求,直到有对象处理它为止。
白话:例如领导让实习生完成一个需求,实习生完成不了转交给初级工程师,初级工程师完成不了转交个中级工程师…直到有人能够完成,或者都没有人能够完成则终止。
案例
抽象类 ,有一个默认方法和一个抽象方法
public abstract class Handler { //下一个人 private Handler handler; public Handler getHandler() { return handler; } public void setHandler(Handler handler) { this.handler = handler; } /** * 思路:先自己处理,自己处理不了交给下一个人 */ public void precess(){ doMyWork(); if(null!=handler){ handler.precess(); } } /** * 自己的处理的抽象方法 */ abstract void doMyWork(); }
客户端链式调用,先实例化多个
对象,串成一条链,然后第一个人执行,自己处理不了传递给下一个人。
public class Client { static class HandleA extends Handler{ @Override void doMyWork() { System.out.println("---------A处理"); } } static class HandleB extends Handler{ @Override void doMyWork() { System.out.println("---------B处理"); } } static class HandleC extends Handler{ @Override void doMyWork() { System.out.println("---------C处理"); } } public static void main(String[] args) { HandleA handleA = new HandleA(); HandleB handleB = new HandleB(); HandleC handleC = new HandleC(); handleA.setHandler(handleB); handleB.setHandler(handleC); handleA.precess(); } }
这种方式有一种不好的地方就是,设置链式关系的时候比较麻烦。
改进方案
我们可以把链式关系封装起来
抽象方法
public abstract class Handler { /** * 抽象公共方法 */ public void precess(Chain chain){ //自己处理 doMyWork(); //链式调用 chain.exec(); } /** * 自己处理的抽象方法 */ abstract void doMyWork(); }
把链式关系封装起来,并添加下标
public class Chain{ //责任链 private List<Handler> handlerList; //责任链下标 private int index=0; public List<Handler> getHandlerList() { return handlerList; } public void setHandlerList(List<Handler> handlerList) { this.handlerList = handlerList; } public void exec(){ //如果所有人都不能解决问题则返回 if(index>=handlerList.size()){ return; } Handler handler = handlerList.get(index); index++; handler.precess(this); } }
客户端调用
public class Client { static class HandleA extends Handler { @Override void doMyWork() { System.out.println("---------A处理"); } } static class HandleB extends Handler { @Override void doMyWork() { System.out.println("---------B处理"); } } static class HandleC extends Handler { @Override void doMyWork() { System.out.println("---------C处理"); } } public static void main(String[] args) { List<Handler> handlerList = Arrays.asList( new HandleA(), new HandleB(), new HandleC()); Chain handler = new Chain(); handler.setHandlerList(handlerList); handler.exec(); } }