首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【实战】使用责任链模式进行报销审批

文章目录

一、报销审批系统分析

二、设计报销审批系统

三、最后总结

一、报销审批系统分析

假设有一个简单的报销审批系统,不同级别的管理者有不同的审批权限。

如果一个报销申请的金额小于等于1000元,则由部门经理批准;

如果金额大于1000且小于等于5000元,则由总经理批准;小于1000元的就不要麻烦总经理了。

如果金额大于5000元,则需要董事长批准。小于5000元的,也不要惊动董事长了。

仔细分析一下,我们可以使用责任链设计模式来设计这个审批流程。

部门经理、总经理、董事长共同构成了一个审核的对象链,达到某一金额,才由某一职级进行审核。

二、设计报销审批系统

首先,我们定义一个审批对象链的抽象类Handler,它包含一个抽象的处理请求方法 handleRequest(),还有设置下一个处理器的setNextHander的方法。

abstract class Handler {

Handler nextHandler;

abstract void handleRequest(RequestPrice request);

protected void setNextHandler(Handler nextHandler) { this.nextHandler = nextHandler; }}

其次,我们需要实现对象链上的处理器,这里共有三级,分别是部门经理、总经理和董事长。

// 部门经理处理类class DepartmentManager extends Handler {

@Override public void handleRequest(RequestPrice request) {// 小于等于1000元时归部门经理处理 if (request.getAmount() <= 1000) {System.out.println("部门经理批准报销申请,金额:" + request.getAmount()); } else { nextHandler.handleRequest(request); } }}// 总经理处理类class GeneralManager extends Handler {

@Override public void handleRequest(RequestPrice request) { // 小于等于5000元时总经理处理 if (request.getAmount() <= 5000) {System.out.println("总经理批准报销申请,金额:" + request.getAmount()); } else { nextHandler.handleRequest(request); } }}// 董事长处理类class Chairman extends Handler {

@Override public void handleRequest(RequestPrice request) {System.out.println("董事长批准报销申请,金额:" + request.getAmount()); }}

然后,我们定义一个请求类 RequestPrice ,用于封装报销申请的信息。

// 审批金额请求类class RequestPrice {

private double amount;

public RequestPrice(double amount) { this.amount = amount; }

public double getAmount() { return amount; }}

接着,增加一个配置文件,用于构建对象链。

@Configurationclass MyConfiguration {

// 构建责任链 @Bean public Handler getHandler(){ // 按照价格从低到高构建责任链 DepartmentManager departmentManager = new DepartmentManager(); GeneralManager generalManager= new GeneralManager(); Chairman chairman = new Chairman();

departmentManager.setNextHandler(generalManager); generalManager.setNextHandler(chairman); return departmentManager; }}

最后写个测试类,分别对800元、3500元、18000元进行报销操作。

import org.springframework.context.annotation.AnnotationConfigApplicationContext;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/** * 责任链简单应用 * @author* @date * @Description * */public class ChainHandlerTest {

public static void main(String[] args) { // 启动应用上下文 AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfiguration.class); // 获取bean Handler handler = context.getBean(Handler.class);

// 创建不同金额的报销申请 RequestPrice request1 = new RequestPrice(800); RequestPrice request2 = new RequestPrice(3500); RequestPrice request3 = new RequestPrice(15000);

// 提交报销申请 handler.handleRequest(request1); handler.handleRequest(request2); handler.handleRequest(request3); }

}

运行结果:

部门经理批准报销申请,金额:800.0总经理批准报销申请,金额:3500.0董事长批准报销申请,金额:15000.0

在上面的代码中,我们使用责任链设计模式,对简单的报销审核系统进行了代码设计,将审批按照金额大小分为3个等级构成一个对象链,当有金额需要报销时,就进入审核对象链,在符合条件的对象里进行审批处理,如果不符合则流入下一个审核对象。

三、最后总结

责任链模式(Chain of Responsibility Pattern)是一种行为模式,它为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。

在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

在上述的简单报销系统中,我们为接收者创建了一个对象链,对发送者也进行了封装,在每个接收者中,几乎都包含对另一个接收者的引用,完全符合责任链模式的定义。

创建一个责任链模式大概分为这么几个步骤:第一,定义接口/抽象类;第二,实现对象链;第三、封装请求对象;第四、配置责任链;最后一步,验证设计。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O7BoLD-WwBbk9zYy88T_czvA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券