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中的拦截器,也是使用的责任链模式。