[设计模式]责任链模式实现 申请聚餐费用流程

2024-03-05 21:52

本文主要是介绍[设计模式]责任链模式实现 申请聚餐费用流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

来考虑这样一个功能:申请聚餐费用的管理。
  很多公司都是这样的福利,就是项目组或者是部门可以向公司申请一些聚餐费用,用于组织项目组成员或者是部门成员进行聚餐活动。
  申请聚餐费用的大致流程一般是:由申请人先填写申请单,然后交给领导审批,如果申请批准下来,领导会通知申请人审批通过,然后申请人去财务领取费用,如果没有批准下来,领导会通知申请人审批未通过,此事也就此作罢。
  不同级别的领导,对于审批的额度是不一样的,比如,项目经理只能审批500元以内的申请;部门经理能审批1000元以内的申请;而总经理可以审核任意额度的申请。
  也就是说,当某人提出聚餐费用申请的请求后,该请求会经由项目经理、部门经理、总经理之中的某一位领导来进行相应的处理,但是提出申请的人并不知道最终会由谁来处理他的请求,一般申请人是把自己的申请提交给项目经理,或许最后是由总经理来处理他的请求。
  
  可以使用责任链模式来实现上述功能:当某人提出聚餐费用申请的请求后,该请求会在 项目经理—〉部门经理—〉总经理 这样一条领导处理链上进行传递,发出请求的人并不知道谁会来处理他的请求,每个领导会根据自己的职责范围,来判断是处理请求还是把请求交给更高级别的领导,只要有领导处理了,传递就结束了。
  需要把每位领导的处理独立出来,实现成单独的职责处理对象,然后为它们提供一个公共的、抽象的父职责对象,这样就可以在客户端来动态地组合职责链,实现不同的功能要求了。

  1. 定义一个抽象的处理器接口: 这个接口定义了处理请求的抽象方法,每个具体的处理器都需要实现这个方法。
public interface Approver {void setNextApprover(Approver approver);boolean approve(MeetingRequest request);
}
  1. 实现具体的处理器类: 每个处理器类都实现了approve方法,并根据自己的权限级别来判断是否批准请求。
public class ProjectManagerApprover implements Approver {private Approver nextApprover;@Overridepublic void setNextApprover(Approver approver) {this.nextApprover = approver;}@Overridepublic boolean approve(MeetingRequest request) {if (request.getAmount() <= 500) {System.out.println("项目经理批准了聚餐费用申请,金额为: " + request.getAmount());return true;} else if (nextApprover != null) {return nextApprover.approve(request);} else {System.out.println("项目经理无法处理聚餐费用申请,金额为: " + request.getAmount());return false;}}
}public class DepartmentManagerApprover implements Approver {private Approver nextApprover;@Overridepublic void setNextApprover(Approver approver) {this.nextApprover = approver;}@Overridepublic boolean approve(MeetingRequest request) {if (request.getAmount() <= 1000) {System.out.println("部门经理批准了聚餐费用申请,金额为: " + request.getAmount());return true;} else if (nextApprover != null) {return nextApprover.approve(request);} else {System.out.println("部门经理无法处理聚餐费用申请,金额为: " + request.getAmount());return false;}}
}public class GeneralManagerApprover implements Approver {private Approver nextApprover;@Overridepublic void setNextApprover(Approver approver) {this.nextApprover = approver;}@Overridepublic boolean approve(MeetingRequest request) {if (nextApprover != null) {return nextApprover.approve(request);} else {System.out.println("总经理处理了聚餐费用申请,金额为: " + request.getAmount());return false;}}
}
  1. 创建一个请求对象: 这个对象包含申请的必要信息,如金额和申请人。
public class MeetingRequest {private double amount;private String applicant;public MeetingRequest(double amount, String applicant) {this.amount = amount;this.applicant = applicant;}public double getAmount() {return amount;}public String getApplicant() {return applicant;}
}
  1. 客户端代码: 客户端代码负责创建请求对象和责任链,并启动请求的审批流程。
public class MeetingRequestHandler {public static void main(String[] args) {Approver projectManager = new ProjectManagerApprover();Approver departmentManager = new DepartmentManagerApprover();Approver generalManager = new GeneralManagerApprover();// 设置责任链projectManager.setNextApprover(departmentManager);departmentManager.setNextApprover(generalManager);// 创建一个聚餐费用申请MeetingRequest request = new MeetingRequest(800, "张三");// 启动审批流程projectManager.approve(request);}
}

在这个示例中,MeetingRequestHandler 类负责启动聚餐费用申请的审批流程。首先,它创建了三个不同级别的审批者(项目经理、部门经理、总经理),并设置了责任链。然后,它创建了一个聚餐费用申请,并将其提交给项目经理进行审批。项目经理检查自己的审批额度,如果不符合,就将请求传递给下一个审批者,直到总经理。

这篇关于[设计模式]责任链模式实现 申请聚餐费用流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/777926

相关文章

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Spring Security中用户名和密码的验证完整流程

《SpringSecurity中用户名和密码的验证完整流程》本文给大家介绍SpringSecurity中用户名和密码的验证完整流程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 首先创建了一个UsernamePasswordAuthenticationTChina编程oken对象,这是S

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java easyExcel实现导入多sheet的Excel

《JavaeasyExcel实现导入多sheet的Excel》这篇文章主要为大家详细介绍了如何使用JavaeasyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录1.官网2.Excel样式3.代码1.官网easyExcel官网2.Excel样式3.代码

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机