责任链模式
一个请求有多个对象可以处理,但是每个对象的处理条件或权限不同,为了避免请求发送者和多个请求处理者发生耦合,将所有请求的处理者通过前一对象记住其下一对象的引用而连成一条链,当有请求发生时,可将请求沿着这条链传递,直到有对象处理他为止。
角色
- 抽象处理者:包括抽象处理方法和一个后继者链接
- 具体处理者:实现抽象处理方法
- 客户端
UML类图
斜体代表抽象类和抽象方法
+:public
-:private
#:protected
案例与实现
以员工请假申请作为案例,小组长可以审批1天的假期,部门经理可以审批1-3天的假期,总经理可以审批3-7天的假期
创建请假申请单
// 请假申请单类
public class ApplyForm {
private Integer days;
private String name;
public Integer getDays() {
return days;
}
public void setDays(Integer days) {
this.days = days;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "ApplyForm{" +
"days=" + days +
", name='" + name + '\'' +
'}';
}
}
抽象处理者
// 抽象处理者
public abstract class BaseHandler {
protected static final Integer ONE_NUM = 1;
protected static final Integer THREE_NUM = 3;
protected static final Integer SEVEN_NUM = 7;
private Integer minDays;
private Integer maxDays;
public Integer getMaxDays() {
return maxDays;
}
public BaseHandler(Integer minDays, Integer maxDays) {
this.minDays = minDays;
this.maxDays = maxDays;
}
private BaseHandler nextHandler;
public void setNextHandler(BaseHandler nextHandler) {
this.nextHandler = nextHandler;
}
protected abstract void handleApply(ApplyForm applyForm);
public final void submit(ApplyForm applyForm) {
this.handleApply(applyForm);
if (Objects.nonNull(this.nextHandler) && applyForm.getDays() > getMaxDays()) {
this.nextHandler.submit(applyForm);
}else {
System.out.println("结束");
}
}
}
具体处理者
// 小组长处理
public class GroupLeader extends BaseHandler {
// 最多可以审批1天
public GroupLeader() {
super(0, ONE_NUM);
}
@Override
protected void handleApply(ApplyForm applyForm) {
System.out.println("小组长审核完成");
}
}
// 部门经理审批
public class DepartmentManager extends BaseHandler {
// 最多可以审批3天
public DepartmentManager() {
super(ONE_NUM, THREE_NUM);
}
@Override
protected void handleApply(ApplyForm applyForm) {
System.out.println("部门经理审批");
}
}
// 总经理审批
public class GeneralManager extends BaseHandler {
// 最多可以审批7天
public GeneralManager() {
super(THREE_NUM, SEVEN_NUM);
}
@Override
protected void handleApply(ApplyForm applyForm) {
System.out.println("总经理审批");
}
}
客户端
public class ResponsibilityTest {
public static void main(String[] args) {
// 创建一个请假申请单
ApplyForm applyForm = new ApplyForm();
applyForm.setName("小明");
// 请假两天,部门经理就可以处理,不需要到总经理处
applyForm.setDays(2);
// 创建处理人实例
GroupLeader groupLeader = new GroupLeader();
DepartmentManager departmentManager = new DepartmentManager();
GeneralManager generalManager = new GeneralManager();
// 设置后继者
groupLeader.setNextHandler(departmentManager);
departmentManager.setNextHandler(generalManager);
// 先将申请提交到小组长处
groupLeader.submit(applyForm);
}
}
运行结果: