当前位置: 首页 > news >正文

[java] 23种设计模式之责任链模式

1.1例子

公司请假系统,业务逻辑如下:
不超过3天的,组长审批
超过3天且小于7天的,总监审批
超过7天且小于15天的,部长审批
超过15天,前端直接拒绝,不会进入审批流程(违反了公司的请假规定)
底层小职员请假,直接去OA系统填写请假申请,生成请假工单
系统会根据请假天数,将请假工单派发给对应的审批人

1.2 考虑使用责任链模式

以请假审批系统为例,组长 → \rightarrow→ 总监 → \rightarrow→ 部长形成了一条链
职员提交请假申请后,请求会沿着这条链传递,直到有对象可以处理它。
一个5天的请假申请,先到达组长处;
组长无权限审批,传递请求到自己的上级(总监);
总监有权限审批,于是同意了该请假申请
作为请求的发送者,职员无需关心最终由谁审批,只需要提交请求即可
这样的设计模式,就是责任链模式(Chain of Responsibility)


                        
1.3 自己理解

一个请求可能需要由不同的handler独立处理,或者需要多个handler同时处理
如果按照常规的编程模式,可能需要繁杂的if-else去实现
将handler通过next引用形成一条责任链,请求发送者只需要发送请求到责任链
请求会在责任链中传递,直到被对应的handler处理(一个或多个)或者无法被处理
这样的话,请求发送者无需关心handler的处理逻辑和请求的传递过程,实现了请求的发送者和处理者的解耦。

1.4 实现一个请假系统

第一步:创建抽象处理者

public abstract class Handler {private Handler next;public void setNext(Handler next) {this.next = next;}public Handler getNext() {return next;}public abstract void handleRequest(String name, int days);
}

第二步:创建组长、总监、部长三个具体处理者,实现具体的处理逻辑

public class PMHandler extends Handler {@Overridepublic void handleRequest(String name, int days) {if (days <= 3) {System.out.println(name + ",组长已经同意您的请假审批!");} else {if (getNext() != null) {getNext().handleRequest(name, days);} else {System.out.println("请假天数太多,申请被驳回!");}}}
}public class DirectorHandler extends Handler {@Overridepublic void handleRequest(String name, int days) {if (days <= 7) {System.out.println(name + ",中心总监已经同意您的请假审批");} else {if (getNext() != null) {getNext().handleRequest(name, days);} else {System.out.println("请假天数太多,申请被驳回!");}}}
}public class MinisterHandler extends Handler {@Overridepublic void handleRequest(String name, int days) {if (days <= 15) {System.out.println(name + ",部长已经同意您的请假审批");} else {if (getNext() != null) {getNext().handleRequest(name, days);} else {System.out.println("请假天数太多,申请被驳回!");}}}
}

第三步:创建Clinet类,在类中创建并使用责任链(向责任链传递请求)

public class OASystem {public static void main(String[] args) {// 创建具体处理者Handler pm = new PMHandler();Handler director = new DirectorHandler();Handler minister = new MinisterHandler();// 构建责任链pm.setNext(director);director.setNext(minister);// 使用责任链pm.handleRequest("张三", 5);}
}

最终的执行结果如下:

相关文章:

  • 大端序、小端序和MSB、LSB
  • 【数据结构】知识点一:线性表之顺序表
  • 多线程系列(十五) -常用并发工具类详解
  • 封装方法2
  • 计算机网络-网络安全(二)
  • 基于Spring Boot+ Vue的房屋租赁系统
  • LVS集群(Linux Virtual server)相关介绍及LVS的NAT模式部署
  • GPT的历史
  • 【设计模式】(二)设计模式六大设计原则
  • LeetCode 热题 100 | 图论(二)
  • 【粉丝福利】一本书讲透ChatGPT,实现从理论到实践的跨越!大模型技术工程师必读
  • 线性代数笔记11--矩阵空间、秩1矩阵
  • 数据库-第四/五章 数据库安全性和完整性【期末复习|考研复习】
  • [Vulnhub]靶场 Web Machine(N7)
  • 【CSP试题回顾】202209-2-何以包邮?
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【个人向】《HTTP图解》阅后小结
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • AHK 中 = 和 == 等比较运算符的用法
  • CSS相对定位
  • Django 博客开发教程 16 - 统计文章阅读量
  • FineReport中如何实现自动滚屏效果
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JAVA SE 6 GC调优笔记
  • k8s 面向应用开发者的基础命令
  • KMP算法及优化
  • Python3爬取英雄联盟英雄皮肤大图
  • Redis在Web项目中的应用与实践
  • Spring Cloud中负载均衡器概览
  • Vue 重置组件到初始状态
  • 程序员最讨厌的9句话,你可有补充?
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 如何解决微信端直接跳WAP端
  • 学习JavaScript数据结构与算法 — 树
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • #《AI中文版》V3 第 1 章 概述
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • $.ajax()方法详解
  • (2)MFC+openGL单文档框架glFrame
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (SpringBoot)第二章:Spring创建和使用
  • (ZT)出版业改革:该死的死,该生的生
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (转)c++ std::pair 与 std::make
  • (转)大型网站的系统架构
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • ... 是什么 ?... 有什么用处?
  • ./configure,make,make install的作用
  • .NET BackgroundWorker
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .net下简单快捷的数值高低位切换