责任链模式数据23种设计模式中的行为型模式,他是使多个对象都有机会处理同一个请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
场景:一个员工报销,需要层层审批,初级领导只能报销500元以内的,中级领导能报销2000以内的,大领导能报销5000以内的,再大的需要找大boss进行报销了,这种情况就可以使用责任链模式进行设计。
一、抽象处理者
abstract class Leader {
protected Leader nextHandler;
public final void handleRequest(int money) {
if (money < limitMoney()) {
doHandler();
} else {
nextHandler.handleRequest(money);
}
}
protected abstract int limitMoney();
protected abstract void doHandler();
}
二、具体的处理者
1、初级领导
class LowLeader extends Leader {
@Override
protected int limitMoney() {
return 500;
}
@Override
protected void doHandler() {
System.out.println("LowLeader能处理500元以内的");
}
}
2、中级领导
class MiddleLeader extends Leader{
@Override
protected int limitMoney() {
return 2000;
}
@Override
protected void doHandler() {
System.out.println("ModdleLeader能处理2000元以内的");
}
}
3、高级领导
class HeightLeader extends Leader {
@Override
protected int limitMoney() {
return 5000;
}
@Override
protected void doHandler() {
System.out.println("HeightLeader能处理5000元以内的");
}
}
4、大领导
class Boss extends Leader {
@Override
protected int limitMoney() {
return Integer.MAX_VALUE;
}
@Override
protected void doHandler() {
System.out.println("Boss能处理所有的");
}
}
三、客户端发起请求
class Test {
public static void main(String[] args) {
//创建各个领导
Leader lowLeader = new LowLeader();
Leader moddleLeader = new MiddleLeader();
Leader heightLeader = new HeightLeader();
Leader boss = new Boss();
//组织各个领导的顺序关系
lowLeader.nextHandler = moddleLeader;
moddleLeader.nextHandler = heightLeader;
heightLeader.nextHandler = boss;
//发起报销请求
lowLeader.handleRequest(999);
}
}
责任链模式除了能够设定好的顺序进行请求之外,还能够进行越级请求,这种请求成为不纯的责任链,在实际应用中遇见的绝大多数数据不纯的责任链模式。
四、责任链模式优缺点
优点:分离职责,动态组合。每个请求者只负责自己的部分,实现了请求者与处理者代码分离,可以对请求者和处理者进行解耦,提高代码灵活性。
缺点:会产生大量的细粒度职责对象。其次责任链太长或者每条链判断处理的时间太长会影响性能,特别是递归循环的时候。