目录:
- 什么是职责链模式
- 为什么要有职责链模式
- 职责链模式的代码实现
什么是职责链模式
GoF中的定义是这样的:将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。
简单来说就是,多个处理器依次处理同一个请求,这个请求会先经过A处理器,处理完后再转交给B、C,以此类推。若某个处理器能够处理完成,则无需转交给下一个处理器来处理。
这种以链条形式处理各自职责的模式,叫做责任链模式。
为什么要有职责链模式
将请求的发送和接收解耦。
职责链模式的代码实现
1、基于链表实现。
1 /** 2 * 职责连-抽象类 3 * 4 * @author zhoude 5 * @date 2020/4/19 18:02 6 */ 7 public abstract class Handler { 8 /** 9 * 链路的接班人,也就是下一个要处理的链路,如果为null则表示这是最后一个链路 10 */ 11 protected Handler successor = null; 12 13 public final void handle() { 14 boolean handler = doHandler(); 15 // 如果此链路未处理完成则转交到下一个链路处理 16 if (!handler && successor != null) { 17 successor.handle(); 18 } 19 } 20 21 /** 22 * 当前链路的处理逻辑 23 * 24 * @return true=处理成功,false=未处理完成,待后续链路处理 25 */ 26 public abstract boolean doHandler(); 27 28 public void setSuccessor(Handler successor) { 29 this.successor = successor; 30 } 31 }
1 public class HandlerA extends Handler { 2 @Override 3 public boolean doHandler() { 4 System.err.println("这里是HandlerA的处理逻辑"); 5 return false; 6 } 7 }
1 public class HandlerB extends Handler { 2 @Override 3 public boolean doHandler() { 4 System.err.println("这里是HandlerB的处理逻辑"); 5 return false; 6 } 7 }
1 /** 2 * 处理链路 3 * 4 * @author zhoude 5 * @date 2020/4/19 18:09 6 */ 7 public class HandlerChain { 8 /** 9 * 头链路 10 */ 11 private Handler head; 12 13 /** 14 * 尾链路 15 */ 16 private Handler tail; 17 18 public void addHandler(Handler handler) { 19 // 每次添加新的处理链前先将尾链路的接班人设置为null,表示无后续链路 20 handler.setSuccessor(null); 21 22 // 第一个链路的头尾链路是同一个 23 if (head == null) { 24 head = handler; 25 tail = handler; 26 return; 27 } 28 29 // 非第一个链路,先设置其接班人为当前新添加的链路 30 tail.setSuccessor(handler); 31 // 新添加一个链路后,此条链路的尾部链路为当前添加的链路 32 tail = handler; 33 } 34 35 public void handler() { 36 if (head != null) { 37 head.handle(); 38 } 39 } 40 }
1 public class Test { 2 public static void main(String[] args) { 3 HandlerChain chain = new HandlerChain(); 4 chain.addHandler(new HandlerA()); 5 chain.addHandler(new HandlerB()); 6 chain.handler(); 7 } 8 }
2、基于数组实现,这种实现方式更加简单
1 /** 2 * 处理链 3 * 4 * @author zhoude 5 * @date 2020/4/19 18:35 6 */ 7 public interface IHandler { 8 /** 9 * 具体处理逻辑 10 * 11 * @return true=处理成功,false=未处理完成,待后续链路处理 12 */ 13 boolean handler(); 14 }
1 public class HandlerA implements IHandler { 2 @Override 3 public boolean handler() { 4 System.err.println("这里是HandlerA的处理逻辑"); 5 return false; 6 } 7 }
1 public class HandlerB implements IHandler { 2 @Override 3 public boolean handler() { 4 System.err.println("这里是HandlerB的处理逻辑"); 5 return false; 6 } 7 }
1 public class HandlerChain { 2 private List<IHandler> chain = new ArrayList<>(); 3 4 public void addHandler(IHandler handler) { 5 this.chain.add(handler); 6 } 7 8 public void handler() { 9 for (IHandler handler : chain) { 10 boolean handled = handler.handler(); 11 if (handled) { 12 break; 13 } 14 } 15 } 16 }
1 public class Test { 2 public static void main(String[] args) { 3 HandlerChain chain = new HandlerChain(); 4 chain.addHandler(new HandlerA()); 5 chain.addHandler(new HandlerB()); 6 chain.handler(); 7 } 8 }