• 设计模式之职责链模式(JAVA实现)


    学习netty框架时,看到有人说netty用到了设计模式的职责链模式,学习一下职责链模式,主要参考大话设计模式。

    主要场景:

    小菜想要加薪,向经理提出加薪请求,经理没有权限,经理交由总监处理,总监也没有权限,交由总经理处理,最后,总经理处理了,不同意。

    职责链的意思就是,如果没有处理该类请求的权限,交由具有更高权限的对象处理。依次类推

    这里将处理对象抽象为Handler类,经理、总监等为继承Handler的具体处理类,同时模拟客户端Client向Handler对象发出请求

    类图如下

    下面为具体代码实现:

    Handler.java

     1 /**
     2  * 抽象的处理类
     3  * @author GXF
     4  *
     5  */
     6 public abstract class Handler {
     7     public Handler successor;                            //后继者,或权限更高的对象
     8     public abstract void handleRequest(int request);    //处理客户端请求
     9     
    10     public void setSuccesor(Handler successor){            //设置后继者,或者更高权限的对象
    11         this.successor = successor;
    12     }
    13 
    14 }

    ConcreteHandler1.java

     1 /**
     2  * 具体处理类1
     3  * 处理请求范围在1~10之间的请求
     4  * @author GXF
     5  *
     6  */
     7 public class ConcreteHandler1 extends Handler {
     8 
     9     @Override
    10     public void handleRequest(int request) {        
    11         if(request >=0 && request <= 10){                //在自己的权限范围内,自己处理
    12             System.out.println("ConcreteHandler1 handle request = " + request);
    13         }
    14         else if(successor != null){                        //超过自己的权限,如果有更高权限对象,交由其处理
    15             successor.handleRequest(request);
    16         }
    17 
    18     }
    19 
    20 }

    ConcreteHandler2.java

     1 /**
     2  * 具体处理类
     3  * 处理reqeuest 10~20范围
     4  * @author GXF
     5  *
     6  */
     7 public class ConcreteHandler2 extends Handler {
     8 
     9     @Override
    10     public void handleRequest(int request) {
    11         if(request > 10 && request <= 20){                    //处理权限范围内的请求
    12             System.out.println("ConcreteHandler2 handle request = " + request);
    13         }
    14         else if(successor != null){                            //不能处理的请求,交由权限更高的处理对象处理
    15             successor.handleRequest(request);
    16         }
    17     }
    18 
    19 }

    ConcreteHandler3.java

     1 /**
     2  * 具体处理类3
     3  * 处理request范围:20~30
     4  * @author GXF
     5  *
     6  */
     7 public class ConcreteHandler3 extends Handler {
     8 
     9     @Override
    10     public void handleRequest(int request) {
    11         if(request > 20 && request <= 30){
    12             System.out.println("ConcreteHandler3 handle request = " + request);
    13         }
    14         else if(successor != null){
    15             successor.handleRequest(request);
    16         }
    17 
    18     }
    19 
    20 }

    Client.java

     1 /**
     2  * 职责链模式客户端
     3  * @author GXF
     4  *
     5  */
     6 public class Client {
     7     
     8     public static void main(String args[]){
     9         //生成三个权限的处理者对象
    10         Handler h1 = new ConcreteHandler1();
    11         Handler h2 = new ConcreteHandler2();
    12         Handler h3 = new ConcreteHandler3();
    13         
    14         //设置职责链后继者
    15         h1.setSuccesor(h2);
    16         h2.setSuccesor(h3);
    17         
    18          //生成1-30的数字,作为请求,交由handler处理
    19         int requests[] = new int[30];
    20         
    21         //初始化reqeusts数组
    22         for(int i = 0; i < requests.length; i++){
    23             requests[i] = i;
    24         }
    25         
    26         for(int i = 0 ; i < requests.length; i++){
    27             h1.handleRequest(requests[i]);
    28         }//for
    29         
    30     }
    31 
    32 }
  • 相关阅读:
    Java数据结构与算法之---求两个数的最大公约数(欧几里得算法)
    Linux下面配置文件~/.bash_profile
    Java数据结构之回溯算法的递归应用迷宫的路径问题
    Java数据结构之对称矩阵的压缩算法---
    Java数据结构之字符串模式匹配算法---KMP算法2
    Java数据结构之字符串模式匹配算法---KMP算法
    Java数据结构之字符串模式匹配算法---Brute-Force算法
    Java数据结构之表的增删对比---ArrayList与LinkedList之一
    Java数据结构之队列的实现以及队列的应用之----简单生产者消费者应用
    Java堆栈的应用1----------堆栈的自定义实现以及括号匹配算法的Java实现
  • 原文地址:https://www.cnblogs.com/luckygxf/p/5351150.html
Copyright © 2020-2023  润新知