文章目录
一、报销审批系统分析
二、设计报销审批系统
三、最后总结
一、报销审批系统分析
假设有一个简单的报销审批系统,不同级别的管理者有不同的审批权限。
如果一个报销申请的金额小于等于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)是一种行为模式,它为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。
在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
在上述的简单报销系统中,我们为接收者创建了一个对象链,对发送者也进行了封装,在每个接收者中,几乎都包含对另一个接收者的引用,完全符合责任链模式的定义。
创建一个责任链模式大概分为这么几个步骤:第一,定义接口/抽象类;第二,实现对象链;第三、封装请求对象;第四、配置责任链;最后一步,验证设计。
领取专属 10元无门槛券
私享最新 技术干货