背景
在日常生活中,会有这种场景:当我们要报销费用时,如果金额较小(比如2000),直系领导审批通过就可;当超过2000小于5000时,直系领导就没有权限了,要上报给部门领导审批;当大于5000时,部门领导也批不了了,需要总经理审批。。。这类场景就对应于设计模式中的责任链模式。
角色定义
抽象处理者角色:一个处理请求的接口,包含一个抽象处理方法和一个后继属性
具体处理者角色:实现抽象处理者角色定义的接口,处理方法实现为:判断能否处理该请求,能处理就处理,不能处理则转给后继属性
客户端角色:创建责任链,并向链首的具体处理者对象提交请求
示例代码
//抽象处理者角色:领导类
public abstract class Leader {
private String name;
public Leader(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
private Leader next;
public void setNext(Leader next) {
this.next=next;
}
public Leader getNext() {
return next;
}
//处理请求的方法
public abstract void handleRequest(int LeaveDays);
}
/**
* 具体处理者角色1:班主任类
*/
public class HeadMaster extends Leader {
public HeadMaster(String name) {
super(name);
}
@Override
public void handleRequest(int LeaveDays) {
if(LeaveDays <= 2)
{
System.out.println("班主任批准请假" + LeaveDays + "天");
}
else
{
if(getNext() != null) {
System.out.println("班主任转给上级" + getNext().
getName());
getNext().handleRequest(LeaveDays);
}
else {
System.out.println("请假天数太多,不予审批!");
}
}
}
}
/**
* 具体处理者角色2:系主任类
*/
public class DepartmentHead extends Leader {
public DepartmentHead(String name) {
super(name);
}
@Override
public void handleRequest(int LeaveDays) {
if(LeaveDays <= 7)
{
System.out.println("系主任批准请假" + LeaveDays + "天");
}
else
{
if(getNext() != null) {
System.out.println("系主任转给上级" + getNext().
getName());
getNext().handleRequest(LeaveDays);
}
else {
System.out.println("请假天数太多,不予审批!");
}
}
}
}
/**
* 具体处理者角色3:院长类
*/
public class Dean extends Leader {
public Dean(String name) {
super(name);
}
@Override
public void handleRequest(int LeaveDays) {
if(LeaveDays <= 12)
{
System.out.println("院长批准请假" + LeaveDays + "天");
}
else
{
if(getNext() != null) {
System.out.println("院长转给上级" + getNext().
getName());
getNext().handleRequest(LeaveDays);
}
else {
System.out.println("请假天数太多,不予审批!");
}
}
}
}
/**
* 客户端角色
*/
public class Test {
public static void main(String[] args) {
Leader headMaster = new HeadMaster("班主任");
Leader dmHead = new DepartmentHead("系主任");
Leader dean = new Dean("院长");
headMaster.setNext(dmHead);
dmHead.setNext(dean);
headMaster.handleRequest(5);
System.out.println("-----");
headMaster.handleRequest(8);
System.out.println("-----");
headMaster.handleRequest(15);
}
}
运行结果:
优缺点
优点:
较好的可扩展性,有需要时可以增加新的请求处理类或者删除某个处理类
简化了对象之间的连接,每个具体处理者只需要持有一个后继属性,不需要持有其他处理者;同时避免了众多的If-else语句
降低了耦合度,当责任链更改时,客户端仍然只需给链首的具体处理者发送请求,不做任何改变
缺点:
请求不一定能处理掉
责任链较长时,性能会有一定的影响
责任链的创建由客户端保证,增加了客户端的复杂性