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

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

相关文章

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

PyCharm中配置PyQt的实现步骤

《PyCharm中配置PyQt的实现步骤》PyCharm是JetBrains推出的一款强大的PythonIDE,结合PyQt可以进行pythion高效开发桌面GUI应用程序,本文就来介绍一下PyCha... 目录1. 安装China编程PyQt1.PyQt 核心组件2. 基础 PyQt 应用程序结构3. 使用 Q

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库