介绍
多个对象都可以处理请求,将这些对象连成一条链,并沿着这条链传递该请求,直到对象处理完成。
应用场景
多个对象可以处理同一个请求,但具体由哪个对象处理则在运行时动态决定
UML
UML.png举例说明
员工有2万要报销,首先找组长报销,但是是组长最大处理额度为1000,所以组长找主管报销,主管只能报5000以内,主管找经理,但是经理也只能在1万以内,最后经理找老板,老板处理了,这就是一个责任链的应用场景。
代码实现
领导抽象类
public abstract class Leader {
/**
* 上一级处理者
*/
protected Leader nextHandler;
public final void handleRequest(int money) {
if(money>limit()){
nextHandler.handleRequest(money);
}else{
handle(money);
}
}
/**
* 自身能处理的最大额度
*/
public abstract int limit();
/**
* 处理行为
*/
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("组长审批金额" + money + "元");
}
}
主管
public class Director extends Leader {
@Override
public int limit() {
return 5000;
}
@Override
public void handle(int money) {
System.out.println("主管审批金额" + money + "元");
}
}
经理
public class Manager extends Leader {
@Override
public int limit() {
return 10000;
}
@Override
public void handle(int money) {
System.out.println("经理审批金额" + money + "元");
}
}
老板
public class Boss extends Leader {
@Override
public int limit() {
return Integer.MAX_VALUE;
}
@Override
public void handle(int money) {
System.out.println("老板审批金额" + money + "元");
}
}
测试
public static void main(String[] args) {
GroupLeader group = new GroupLeader();
Director director = new Director();
Manager manager = new Manager();
Boss boss = new Boss();
group.nextHandler = director;
director.nextHandler = manager;
manager.nextHandler = boss;
group.handleRequest(7000);
group.handleRequest(2000);
group.handleRequest(200);
group.handleRequest(50000);
}
输出
输出截图.png总结
责任链就是讲所有能处理请求的对象连成一个链,然后逐个寻找能处理请求的那个对象,就这么简单,
优点:可以对请求和处理者关系解耦,提高代码的灵活性,
缺点:需要遍历链,影响性能。
网友评论