Java设计模式超详解--责任链设计模式(含uml图)

一,结合uml图理解一下

举个例子:

如果您是一名小员工,某天需要拿着采购单去求经费(大约20块钱的样子~~),您先找到项目经理

项目经理说:sorry~我没有这个权利哦

然后您去找部门经理

部门经理说:sorry~我没有这个权利哦

然后您去找总经理

总经理说:(ノ`Д)ノ滚去找项目经理,屁大点事还要麻烦我!!!○・`Д´・ ○

这时您会发现:您!被!踢!皮!球!啦!

但是!!!!!!!!!!!!!

如果您所在的公司采取的是责任链方式的话,您就完全不用担心啦~~

为什么说不用担心需求无法被处理呢?

在责任链设计模式类图中:

抽象处理者(Handler)

当client发出请求:我要找一个管理者申请经费

这个时候找到了Handler

Handler的使命就是:不管怎么样,一定要把client 的指令放在心上,返回一个确切的结果

具体处理者(Concrete Handler)

Handler想要处理业务,他一个人肯定是办不到的

因此他找到了Concrete Handler:公司中不同等级的人

来对client做出响应

并且是必须回答,且责任链是单向的,不能出现例子中总经理去找项目经理的情况

二,结合题目进行理解

题目

某公司申请经费,

1.金额小于1000的项目经理(ProjectManager)就可以审批:

2.小于2000的部门经理(DepartmentManager)可以审批:

3.大于2000的只能总经理(TopManager)审批:

4.若经费大于10000,总经理直接拒绝

使用职责链模式,申请人提交给项目经理申请经费,项目经理如果权限够的话就审批,不够的话就提交到上级领导,依次类推,直到能够处理请求为止。

根据一部分的uml图,理解一下:

哪个是Handler,哪些是Concrete Handler

显而易见,在刚刚的描述中:Concrete Handler:指的是公司中不同等级的人

所以本题中的Concrete Handler是

ProjectManager,DepartmentManager,TopManager

Handler

在题目中并没有特意指出,那我们要自己找到这个管理者(写出这个类),然后把需求交给他,让他帮我们处理

得到uml图如下:

这里将main测试类就直接作为client看待,用于测试责任链能否返回结果

管理者代码:

java 复制代码
//这里主要处理自己的上级,为每一个角色设置属于自己的上级
abstract class Manager {
    protected Manager superior;//用protected,这样子类可以直接用superior,superior表示自己的上级

    public abstract boolean handle(int fee);

    public  void setSuccessor(Manager superior){//设置自己的上级
        this.superior=superior;
    }

}

测试类:

java 复制代码
public class Main {
    public static void main(String[] args){
        int[] arr = {500, 1500, 2500, 29000};
        Manager pm = new ProjectManager();
        Manager dm = new DepartmentManager();
        Manager topm = new TopManager();
        pm.setSuccessor(dm);//设置pm的上级为dm
        dm.setSuccessor(topm);//设置dm的上级为topm

        for(int i = 0; i < arr.length; i++) {
            pm.handle(arr[i]);
        }
    }
}

关键!!!不同处理者的处理方法,逻辑如下

如果我不能处理的话,就将请求传给自己的上级

最高一级的人员(总经理)必须把这个事情给了结了

java 复制代码
class ProjectManager extends Manager{//项目经理

    public boolean handle(int fee){
        if(fee <1000){
            System.out.println("ProjectManager pass");
            return true;
        }
        else{
            return this.superior.handle(fee);//钱多于1000了,将请求传给上级
        }
    }
}

class DepartmentManager extends Manager{//部门经理
     public boolean handle(int fee){
        if(fee <2000){
            System.out.println("DepartmentManager pass");
            return true;
        }
        else{
            return this.superior.handle(fee);//钱多于2000了,将请求传给上级
          
        }
    }
    
}

class TopManager extends Manager{//总经理
     public boolean handle(int fee){
    if(fee >=10000){
           System.out.println("TopManager refuse");
            return false;
        }
        else
        {
            System.out.println("TopManager pass");//钱多于10000了,此时已经没有上级了,直接return true;
            return true;
        }
      
    }
}

三,总结

责任链使用场景

  • 当有多个对象可以处理请求,且具体由哪个对象处理由运行时决定时。
  • 当需要向多个对象中的一个提交请求,而不想明确指定接收者时

希望对大家有用,祝您开心~(o゜▽゜)o☆,有问题欢迎交流,俺会改的✊

相关推荐
别动我齐刘海5 小时前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人
code2cat6 小时前
Java进阶篇之AtomicLongFieldUpdater:把累计额度留在对象字段中
java·cas·并发编程
WeiXin_DZbishe6 小时前
基于springboot城市公交实时运营与调度系统-计算机毕设 附源码【课程设计】66173
java·vue.js·spring boot·后端·python·php·课程设计
泡茶喝茶写代码6 小时前
A股量化数据工程:从 REST 接口到策略信号(第 18 篇):放量缩量异动扫描
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
wewowilling7 小时前
认识微服务
java·运维·微服务·springcloud
代码什么用7 小时前
Java Web 7-10
java·servlet
蜗牛互联网9 小时前
GPT-6 与 Intelligent UI:从回答到可审计操作的产品迁移
java·人工智能·后端
SL_staff9 小时前
运维救火实录:钉钉考勤API变更引发工资计算异常,我们用JVS-Logic可视化逻辑引擎实现分钟级热修复
java·mysql·全栈
SunnyDays10119 小时前
Java 查找并高亮 Word 文字:精确查找及正则表达式模糊查找
java·查找文字·word 文档·高亮文字·正则匹配查找·模糊查找