java设计模式--责任链模式

本文详细阐述了责任链模式在企业报销流程中的应用,通过构建责任链,实现不同层级人员根据权限处理报销单据,提高了工作效率并确保了流程的规范性。通过实例代码演示,展示了如何在实际场景中运用责任链模式解决复杂问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 简介

    个人觉得:它减少了if else 判断,而且易扩展

2 原理:

    顾名思义我们可以把他看成一条链子,一环扣一环,就比如一个老板不可能什么鸡毛蒜皮的小事都是我来处理,那不是把老板累死?行吧 那这样吧,老板想了个办法,我手下那么多职位,每个职位分配个我觉得这个职位的人能解决的范围让它去解决就行了,剩下的我觉得必须我来处理的我才处理,那怎么才能到我这? 员工-主管 -老板  方正就是一层一层找呗 ,直到能处理为止(权利游戏?权利越大责任就越大)

    我们就以报销为例

3 UML



代码:

报销单:

package com.sl.demo.resposibility;
/**
 * 报销单
 * @author pengkun
 *
 */
public class ExpenseAccount {
	//名字
	private String name;
	//金额
	private double price;
	//理由
	private String cause;
	
	public ExpenseAccount(String name, double price, String cause) {
		super();
		this.name = name;
		this.price = price;
		this.cause = cause;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
	public String getCause() {
		return cause;
	}
	public void setCause(String cause) {
		this.cause = cause;
	}
	
	
	
	
}



/**
 * 领导
 * @author pengkun
 *
 */
public abstract class Lead {
	//姓名
	protected String name;
	//比他高的领导(他老大)
	protected Lead nextLead;
	
	public Lead(String name) {
		super();
		this.name = name;
	}
	//处理账单能力(权利)
	public abstract void droit(ExpenseAccount account) ;


	public void setNextLead(Lead nextLead) {
		this.nextLead = nextLead;
	}
	
	
}

package com.sl.demo.resposibility;
/**
 * 普通财务人员
 * @author pengkun
 *
 */
public class FinancialStaff extends Lead {


	public FinancialStaff(String name) {
		super(name);
	}

	@Override
	public void droit(ExpenseAccount account) {
		//报销单填写人
		String strnName=account.getName();
		//报销单金额
		double price=account.getPrice();
		//报销单申请理由
		String cause=account.getCause();
		//判断金额有没有超过我的处理范围
		if(price<1000) {
			System.out.println("申请人:"+strnName+"申请金额:"+price);
			System.out.println("申请理由:"+cause);
			System.out.println("审批普通财务人员:"+this.name+"同意报销");
		}
		//超出自己处理范围交给老大处理
		else {
			System.out.println("申请金额太大,普通财务人员:"+this.name+"无法处理");
			//判断是否有上级
			if(nextLead!=null) {
				//有老大就给老大处理
				nextLead.droit(account);
			}else {
				System.out.println("报销失败");
			}
		}
		
		
	}



}


package com.sl.demo.resposibility;
/**
 * 财务主管
 * @author pengkun
 *
 */
public class FinancialExecutive extends Lead {

	public FinancialExecutive(String name) {
		super(name);
	}

	@Override
	public void droit(ExpenseAccount account) {
		//报销单填写人
		String strnName=account.getName();
		//报销单金额
		double price=account.getPrice();
		//报销单申请理由
		String cause=account.getCause();
		//判断金额有没有超过我的处理范围
		if(price<10000) {
			System.out.println("申请人:"+strnName+"申请金额:"+price);
			System.out.println("申请理由:"+cause);
			System.out.println("审批主管:"+this.name+"同意报销");
		}
		//超出自己处理范围交给老大处理
		else {
			System.out.println("申请金额太大,主管:"+this.name+"无法处理");
			//判断是否有上级
			if(nextLead!=null) {
				//有老大就给老大处理
				nextLead.droit(account);
			}else {
				System.out.println("报销失败");
			}
		}
	}
	

}

public class Boss extends Lead {

	public Boss(String name) {
		super(name);
	}

	@Override
	public void droit(ExpenseAccount account) {
		//报销单填写人
		String strnName=account.getName();
		//报销单金额
		double price=account.getPrice();
		//报销单申请理由
		String cause=account.getCause();
		//判断金额有没有超过我的处理范围
		if(price<1000000) {
			System.out.println("申请人:"+strnName+"申请金额:"+price);
			System.out.println("申请理由:"+cause);
			System.out.println("审批老板:"+this.name+"同意报销");
		}
		//超出自己处理范围交给老大处理
		else {
			System.out.println("申请金额太大,老板:"+this.name+"无法处理");
			//判断是否有上级
			if(nextLead!=null) {
				//有老大就给老大处理
				nextLead.droit(account);
			}else {
				System.out.println("报销失败");
			}
		}
	}

}

根据每个职位的处理能力不同,从而处理自己权利范围内的事情,自己解决不了的交给下一个级别的人来处理

测试:

@Test
	public void test() {
		//报销单
		ExpenseAccount account=new ExpenseAccount("小明", 20000, "海口出差两个月");
		//有三人不同职位
		Lead zs=new FinancialStaff("张三");
		Lead ls=new FinancialExecutive("李四");
		Lead ww=new Boss("王五");//老板 没有领导
		//设置领导
		zs.setNextLead(ls);
		ls.setNextLead(ww);
		//现在报销单让普通财务员工张三处理
		zs.droit(account);
		
	}

结果:

申请金额太大,普通财务人员:张三无法处理
申请金额太大,主管:李四无法处理
申请人:小明申请金额:20000.0
申请理由:海口出差两个月
审批老板:王五同意报销


责任链模式使用的地方很多,比如我们常见的try…catch…就是,可以有多个catch,一个个往下判断;再比如servlet里面的过滤器,就是一个责任链;再比如struts2中的拦截器,也是使用的责任链模式。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值