设计模式——责任链模式
定义: 该模式为了避免请求者与多个请求处理者耦合在一起, 将所有的请求处理者通过前一对象记住后一个对象的引用而连成一条链, 当有请求发生时, 将请求沿着这一条链传递, 直到有对象处理为止. 例如工作中的请假审批, 请假申请 -> 部门经理审批 -> 副总经理审批 -> 总经理审批
结构:
- 抽象处理者: 定义一个抽象处理接口, 包含抽象处理方法和一个后继连接
- 具体处理者: 实现抽象处理者的处理方法, 判断能否处理本次请求, 如果可以处理则处理, 不能处理则将请求转给后继者
- 客户类: 创建处理链, 并向链头的处理者提交请求, 客户不关心传递过程和处理细节
实现:
例: 请假处理系统. 部门负责人能处理
请假申请
@AllArgsConstructor
@Data
public class LeaveRequest {
private String name;
private int daysNum;
private String content;
}
抽象处理者
@Data
public abstract class Handler {
private int numStart;
private int numEnd;
private Handler nextHandler;
public Handler(int numStart) {
this.numStart = numStart;
}
public Handler(int numStart, int numEnd) {
this.numStart = numStart;
this.numEnd = numEnd;
}
protected abstract void handleLeaveRequest(LeaveRequest request);
public final void submit(LeaveRequest request) {
this.handleLeaveRequest(request);
if (this.nextHandler != null && request.getDaysNum() > numEnd) {
this.nextHandler.submit(request);
} else {
System.out.println("流程结束");
}
}
}
具体处理者
public class GroupLeader extends Handler {
public GroupLeader() {
super(0, 1);
}
protected void handleLeaveRequest(LeaveRequest request) {
System.out.println("部门管理者同意审批");
}
}
public class Manager extends Handler {
public Manager() {
super(0, 7);
}
protected void handleLeaveRequest(LeaveRequest request) {
System.out.println("经理同意审批");
}
}
Main
public class Main {
public static void main(String[] args) {
LeaveRequest request = new LeaveRequest("wtw", 3, "不舒服");
GroupLeader groupLeader = new GroupLeader();
Manager manager = new Manager();
groupLeader.setNextHandler(manager);
groupLeader.submit(request);
}
}