设计模式学习笔记(九、行为型-职责链模式)

目录:

  • 什么是职责链模式
  • 为什么要有职责链模式
  • 职责链模式的代码实现

什么是职责链模式

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 }
原文地址:https://www.cnblogs.com/bzfsdr/p/12732933.html