一、基本介绍
责任链模式(行为型):为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
二、包含角色
1.抽象处理者角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
2.具体处理者角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
三、案例及UML类图
案例说明:
在公司请假的时候,一般请假天数过多会向上级申请,假设,请假天数不大于3天主管批准即可,否则提交给经理,经理能处理请假天数不大于7天的,如果大于7天,则交给主管处理,如果大于30天,则不批准请假。
UML类图:
类Leader:
public abstract class Leader {
private Leader nextleader;
/**
* 处理方法
* @param leaveDays 请假天数
*/
public abstract void handleRequest(int leaveDays);
public Leader getNextleader() {
return nextleader;
}
public void setNextleader(Leader nextleader) {
this.nextleader = nextleader;
}
}
说明:领导抽象类,抽象处理者角色,定义处理接口,设置下一条链和获取下一条链。
类ExecutiveDirector:
public class ExecutiveDirector extends Leader {
private int maxLeaveDays = 3;
@Override
public void handleRequest(int leaveDays) {
if(leaveDays <= maxLeaveDays) {
System.out.println("主管批准");
}else {
getNextleader().handleRequest(leaveDays);
}
}
}
说明:主管类,具体处理者角色,处理不大于3天的请假,否则给下一个领导处理。
类Manager:
public class Manager extends Leader {
private int maxLeaveDays = 7;
@Override
public void handleRequest(int leaveDays) {
if(leaveDays <= maxLeaveDays) {
System.out.println("经理批准");
}else {
getNextleader().handleRequest(leaveDays);
}
}
}
说明:经理类,具体处理者角色,处理不大于7天的请假,否则给下一个领导处理。
类ChiefInspector:
public class ChiefInspector extends Leader {
private int maxLeaveDays = 30;
@Override
public void handleRequest(int leaveDays) {
if(leaveDays > maxLeaveDays) {
throw new RuntimeException("超过公司请假最大期限,不批准!");
}
System.out.println("总监批准");
}
}
说明:总监类,具体处理者角色,处理不大于30天的请假,否则抛异常结束(最后一个处理的)。
类ResponsibilityChainTest:
public class ResponsibilityChainTest {
public static void main(String[] args) {
//主管
Leader executiveDirector = new ExecutiveDirector();
//经理
Leader manager = new Manager();
//总监
Leader chiefInspector = new ChiefInspector();
//设置下一条
executiveDirector.setNextleader(manager);
manager.setNextleader(chiefInspector);
//第一条链执行即可
executiveDirector.handleRequest(3);
}
}
说明:测试及客户端类。需要先设置好链的顺序,然后调用第一条执行即可。
四、适用场景
1.有多个对象处理同一个请求,并且按一定顺序执行。
2.在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
3.可动态指定一组对象处理请求,或添加新的处理者。