责任链模式——定义
什么是责任链模式呢?
我们可以先来看一个场景:
公司有三个角色,普通员工、主管、总监。普通员工要请三天内的假只要上报主管就行,可如果要三天以上可能主管就没办法审批,就得把请假上报到总监。
那么这段逻辑可以用以下代码体现:
// 返回审批结果
public void getResult(Integer days) {
if ("主管".equals(this.jobType)) {
if (days <= 3) {
System.out.println("我同意了");
} else {
System.out.println("我无权处理");
}
} else if ("总监".equals(this.jobType)) {
System.out.println("我同意了");
}
}
可以看到这段代码有太多的分支判断,后续的扩展性维护性极低。
而责任链模式就是应用在这一类场景中。
先来看看责任链模式的结构:
图源于《大话设计模式》
图看不懂没关系,可以先看实现等回过头再慢慢理解。
代码实现
首先把主管、经理单独定义类,并且令它们继承同一个抽象类Handle:
public abstract class Handle {
// 设置继任者
protected Handle successor;
public Handle setSuccessor(Handle successor) {
this.successor = successor;
return this;
}
// 审批
public abstract void getResult(Integer day);
}
所谓继任者就是当自身无法处理这个请求的时候,会把请求传递给的一个对象。落实到我们的例子中就是,主管设置的继任者就是总监,当主管无法处理三天以上假期的请求时,就是调用总监请求。
主管类:
// 主管
public class Manager extends Handle {
@Override
public void getResult(Integer day) {
if (day < 3) {
System.out.println("我同意了");
} else {
System.out.println("转给总监审批");
this.successor.getResult(day);
}
}
}
总监类:
// 总监
public class Director extends Handle {
@Override
public void getResult(Integer day) {
System.out.println("我同意了");
}
}
员工发起请假(客户端调用):
public static void main(String[] args) {
Handle manager = new Manager();
Handle director = new Director();
// 设置继任者
manager.setSuccessor(director);
System.out.println("开始请假两天");
// 请2天
manager.getResult(2);
System.out.println("开始请假五天");
// 请五天
manager.getResult(5);
}
/** output
开始请假两天
我同意了
开始请假五天
转给总监审批
我同意了
责任链的好处是当客户提交一个请求是不必关心它是由哪个对象处理的,服务端可以随时增加或修改处理请求的结构,增强了灵活性。