责任链模式(可以让多个对象可能都能够处理某个请求)
2017-11-18 本文已影响5人
钉某人
源码地址 | https://github.com/DingMouRen/DesignPattern |
---|
- Handler 抽象处理者,声明一个请求处理的方法,并在其中保持一个对下一个处理节点Handler对象的引用
- ConcreteHandler 具体处理者,对请求进行处理,如果不能处理就将该请求转发给下一个节点上的处理兑对象
定义
责任链模式使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连城一条链,并沿着这条链传递该请求,直到有对象处理它为止。
使用场景
- 多个对象可以处理同一请求,但具体哪个对象处理需要在运行时动态决定
- 在请求处理者不明确的情况下向多个对象中的一个提交一个请求
- 需要动态指定一组对象处理请求
协作
当客户端提交一个请求时,请求沿链传递直至一个ConcreteHandler对象负责处理它
非简化版责任链模式的代码演示请到源码
举个栗子
出差报账是经常遇到的,在公司里如果额度很大的话,就得一级一级的向上申报,每级领导审批的额度是有最大限制的,这里就用这个例子。但是这里不再将请求封装成对象了,报账的额度就是请求。
//抽象处理者:领导们╮(╯▽╰)╭
public abstract class Leader {
public Leader nextLeader;//上一任领导,对应下一个处理者对象
/**
* 处理报账
* @param money 请求报账的额度
*/
public final void handleRequest(int money){
if (money <= limit()){
handle(money);
}else {
if (null != nextLeader) nextLeader.handleRequest(money);
}
}
/**
* 自身能够批复的最大额度
* @return 返回额度
*/
public abstract int limit();
/**
* 处理报账的具体行为
* @param money
*/
public abstract void handle(int money);
}
//具体处理者:组长
public class GroupLeader extends Leader {
@Override
public int limit() {
return 1000;
}
@Override
public void handle(int money) {
System.out.println(getClass().getSimpleName()+"批复了"+money);
}
}
//具体处理者:主管
public class Director extends Leader{
@Override
public int limit() {
return 5000;
}
@Override
public void handle(int money) {
System.out.println(getClass().getSimpleName()+"批复了"+money);
}
}
使用
public static void main(String[] args) {
//构建处理者对象:领导们
Leader groupLeader = new GroupLeader();
Leader directorLeader = new Director();
Leader managerLeader = new Manager();
Leader boss = new Boss();
//设置处理的责任链关系
groupLeader.nextLeader = directorLeader;
directorLeader.nextLeader = managerLeader;
managerLeader.nextLeader = boss;
//发起报账的请求
groupLeader.handleRequest(3000);
}
总结
责任链模式优点是实现了请求者和处理者关系的解耦,提高了代码的灵活性。最大的缺点就是在链中请求处理者的遍历。如果处理者太多,那么遍历就会影响性能咯。