zoukankan      html  css  js  c++  java
  • 5 行为型模式之

    责任链模式介绍:

    责任链模式是行为模式之一,什么是“链”?我们将多个节点首尾相连,就形成了链,对于链式结构,每个节点都可以拆开再重新连接,因此链式结构也具有很好的灵活性。将这样一种结构应用于编程领域,将每一个节点看作是一个对象,每一个对象拥有不同的处理逻辑,将一个请求从一个链的首端发出,沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止,我们将这样的一种模式称为责任链模式。

    责任链模式的定义:

    使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,只到有对象处理为止。

    使用场景:多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。

    在请求处理者不明确的情况下向多个对象中的一个提交一个请求

    例子:我们以工作中报销费用为例子,一般我们先找组长报销,组长的权限是一定的,只能报一定范围内的钱,如果走出了组长的权限,我们就要向经理报,如果经理也报不了,就向总监报销,如果连总监也报不了,就直接发给老板报销,如果老板也报不了那就真的报不了啦。但是如果中间任何一个报销了,就返回,不再往上申请了。

    代码如下:

     1 /**
     2  *
     3  * 使多个对象都有计划处理请求,从而避免请求的发送者和接受者之间的耦合关系。
     4  * 将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
     5  *
     6  */
     7 public abstract class Leader {
     8     protected Leader preLeader;   //上一级的领导
     9 
    10     public final void handleRequest(int money){
    11         if(handler(money)){
    12             return;
    13         }
    14 
    15         if(preLeader != null){
    16             preLeader.handleRequest(money);
    17         }
    18     }
    19 
    20     public void setPreLeader(Leader leader){
    21         this.preLeader = leader;
    22     }
    23 
    24     //自已能批复的最大的报销额度
    25     protected abstract int limit();
    26 
    27     //处理报销行为
    28     protected abstract boolean handler(int money);
    29 
    30 }

    组长:

     1 /**
     2  * 组长
     3  * 只多只能报1000元以内的
     4  */
     5 public class GroupLeader extends Leader{
     6     @Override
     7     protected int limit() {
     8         return 1000;
     9     }
    10 
    11     @Override
    12     protected boolean handler(int money) {
    13         if(money > limit()){
    14             return false;
    15         }
    16 
    17         System.out.println("组长批准了报销");
    18         return true;
    19     }
    20 }

    主管:

     1 /**
     2  * 主管
     3  */
     4 public class Director extends Leader{
     5     @Override
     6     protected int limit() {
     7         return 5000;
     8     }
     9 
    10     @Override
    11     protected boolean handler(int money) {
    12         if(money > limit()){
    13             return false;
    14         }
    15 
    16         System.out.println("主管批准了报销");
    17         return true;
    18     }
    19 }

    经理

     1 /**
     2  * 经理 
     3  * 最多可以报 10000
     4  */
     5 public class Manager extends Leader{
     6     @Override
     7     protected int limit() {
     8         return 10000;
     9     }
    10 
    11     @Override
    12     protected boolean handler(int money) {
    13         if(money > limit()){
    14             return false;
    15         }
    16 
    17         System.out.println("经理批准了报销");
    18         return true;
    19     }
    20 }

    老板:不受限制

     1 /**
     2  * 老板
     3  * 不限制
     4  */
     5 public class Boss extends Leader{
     6 
     7     @Override
     8     protected int limit() {
     9         return Integer.MAX_VALUE;
    10     }
    11 
    12     @Override
    13     protected boolean handler(int money) {
    14         if(money > limit()){
    15             return false;
    16         }
    17 
    18         System.out.println("老板批准了报销");
    19         return true;
    20     }
    21 }

    测试类如下:

     1 /**
     2  * 责任链模式,有两种情况:
     3  * 1 先自己处理,自己处理不了,再交给上级处理
     4  * 2 先交给上级处理,上级处理不了,再自己处理(比如类的加载机制)
     5  */
     6 public class ChainTest {
     7 
     8     public static void main(String[] args){
     9         Leader groupLeader = new GroupLeader();
    10         Leader directorLeader = new Director();
    11         Leader boss = new Boss();
    12 
    13         groupLeader.setPreLeader(directorLeader);
    14         directorLeader.setPreLeader(boss);
    15         boss.setPreLeader(null);
    16 
    17         groupLeader.handleRequest(50000);
    18 
    19     }
    20 
    21 
    22 }

    上的例子报销请求一级一级的往上传,直到有一个对象请求为止

    注:设计模式交流学习群 632945466  欢迎所有热爱技术的大牛,小菜,一起学习讨论进步提高,欢迎随时批评指正

  • 相关阅读:
    LINUX挂接移动硬盘
    LINUX挂接光盘镜像文件
    Parted:2T以上磁盘分区工具(LINUX挂载2T以上磁盘)
    LINUX文件系统操作命令
    linux 文件类型的颜色
    LINUX常用操作命令和命令行编辑快捷键
    telnet- Linux必学的60个命令
    Netstat- Linux必学的60个命令
    linux服务之maven
    PHP 设计模式 笔记与总结(4)PHP 链式操作的实现
  • 原文地址:https://www.cnblogs.com/start1225/p/6725630.html
Copyright © 2011-2022 走看看