使编程更有灵活性——责任链模式
责任链模式的定义
使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
责任链模式的使用产场景
多个对象可以处理同一个请求,但具体由哪个对象处理则在运行时动态决定。
在请求处理者不明确的情况下向多个对象中的一个提交一个请求。
需要动态指定一组对象处理请求。
责任链模式的实例
我们假设一个场景,在外出差需要报销费用。例如用了5W块,然后报销,组长只能报销1000以下的,主管只能报销5000以下的,经理只能报销10000以下的,老板则有权限报销任何数字,当然也要老板真能给。这样我们的请求报销就是一个请求,组长、主管、经理、老板则是处理者。
抽象领导者
Leader.class
public abstract class Leader {
//上一级领导处理者
protected Leader nextHandler;
/**
* description: 处理请求
*/
public final void handleRequest(int money) {
if (money <= limit()) {
handle(money);
} else {
nextHandler.handleRequest(money);
}
}
/**
* description: 能批复的额度
*/
public abstract int limit();
/**
* description: 处理报销
*/
public abstract void handle(int money);
}
各个具体的领导者
GroupLeader.class
/**
* description: 组长处理者
*/
public class GroupLeader extends Leader {
private static final String TAG = "GroupLeader";
@Override
public int limit() {
return 1000;
}
@Override
public void handle(int money) {
Log.i(TAG, "组长批复报销" + money + "元");
}
}
DirectorLeader.class
/**
* description: 主管处理者
*/
public class DirectorLeader extends Leader {
private static final String TAG = "DirectorLeader";
@Override
public int limit() {
return 5000;
}
@Override
public void handle(int money) {
Log.i(TAG, "主管批复报销" + money + "元");
}
}
ManagerLeader.calss
/**
* description: 经理处理者
*/
public class ManagerLeader extends Leader {
private static final String TAG = "ManagerLeader";
@Override
public int limit() {
return 10000;
}
@Override
public void handle(int money) {
Log.i(TAG, "经理批复报销" + money + "元");
}
}
Boss.class
/**
* description: 老板处理者
*/
public class Boss extends Leader {
private static final String TAG = "Boss";
@Override
public int limit() {
return Integer.MAX_VALUE;
}
@Override
public void handle(int money) {
Log.i(TAG, "老板批复报销" + money + "元");
}
}
请求发起
Requester.calss
public class Requester {
public void request() {
//构造各个领导者
GroupLeader groupLeader = new GroupLeader();
DirectorLeader directorLeader = new DirectorLeader();
ManagerLeader managerLeader = new ManagerLeader();
Boss boss = new Boss();
//设置上一级领导处理者对象
groupLeader.nextHandler = directorLeader;
directorLeader.nextHandler = managerLeader;
managerLeader.nextHandler = boss;
//请求者发起请求
groupLeader.handleRequest(50000);
}
}
其实责任链模式就像是我们写if…else…,如果你有兴趣,完全可以使用责任链模式来替代各种分支或条件判断语句,不过大多数都是多此一举。当分支中需要有很多的操作时,运用责任链模式,可以减少方法的赋值度。
小结
优点
可以对请求者和处理者关系解耦,提高代码的灵活性。
缺点
对链中请求处理者的遍历,如果处理者太多,那么遍历必定会影响性能,特别是在一些递归调用中,要慎用。