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


    目录:

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

    什么是职责链模式

    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 }
  • 相关阅读:
    PAT L2-014【二分】
    CodeForces 137C【贪心+优先队列】
    CodeForces 131D【图特性+BFS】
    CodeForces 125D【鸽巢原理】
    PAT1060【大模拟啊】
    CodeForces 124C【连通块】
    PAT 1071【STL string应用】
    CodeForces 116C 【BFS】
    CodeForces 116B【二分匹配】
    CodeForces 118C 【模拟】
  • 原文地址:https://www.cnblogs.com/bzfsdr/p/12732933.html
Copyright © 2020-2023  润新知