设计模式 - 责任链模式(Chain of Responsibility Pattern)
介绍
责任链模式是一种行为设计模式,它允许请求沿着处理者链传递,直到其中一个处理者处理它为止。每个处理者要么处理请求,要么将请求沿着链传递给下一个处理者。这种模式非常适合处理多级审批流程或其他需要按顺序处理请求的情况。
实现
我们以一个公司请假申请的审批流程为例,来说明如何使用责任链模式来处理请假请求。
定义处理者接口
首先定义一个处理者接口,它包含处理请求的方法。
interface LeaveApprover {
void processRequest(LeaveRequest request);
}
创建具体处理者类
然后创建具体的处理者类,每个处理者都持有下一个处理者的引用,并且可以根据权限级别处理请求。
abstract class AbstractLeaveApprover implements LeaveApprover {
private LeaveApprover nextApprover;
public void setNextApprover(LeaveApprover nextApprover) {
this.nextApprover = nextApprover;
}
public abstract void processRequest(LeaveRequest request);
}
class Manager extends AbstractLeaveApprover {
@Override
public void processRequest(LeaveRequest request) {
if (request.getDays() <= 3) {
System.out.println("Manager approves leave for " + request.getEmployeeName() + " for " + request.getDays() + " days.");
} else {
if (nextApprover != null) {
nextApprover.processRequest(request);
} else {
System.out.println("No approver available for leave request.");
}
}
}
}
class Director extends AbstractLeaveApprover {
@Override
public void processRequest(LeaveRequest request) {
if (request.getDays() <= 7) {
System.out.println("Director approves leave for " + request.getEmployeeName() + " for " + request.getDays() + " days.");
} else {
if (nextApprover != null) {
nextApprover.processRequest(request);
} else {
System.out.println("No approver available for leave request.");
}
}
}
}
class CEO extends AbstractLeaveApprover {
@Override
public void processRequest(LeaveRequest request) {
System.out.println("CEO approves leave for " + request.getEmployeeName() + " for " + request.getDays() + " days.");
}
}
创建请假请求类
创建一个请假请求类来表示员工的请假申请。
class LeaveRequest {
private String employeeName;
private int days;
public LeaveRequest(String employeeName, int days) {
this.employeeName = employeeName;
this.days = days;
}
public String getEmployeeName() {
return employeeName;
}
public int getDays() {
return days;
}
}
使用责任链模式
接下来,在主程序中使用责任链模式来处理请假请求。
public class LeaveApprovalSystem {
public static void main(String[] args) {
LeaveApprover manager = new Manager();
LeaveApprover director = new Director();
LeaveApprover ceo = new CEO();
// 设置责任链
manager.setNextApprover(director);
director.setNextApprover(ceo);
// 创建请假请求
LeaveRequest request1 = new LeaveRequest("Alice", 2);
LeaveRequest request2 = new LeaveRequest("Bob", 5);
LeaveRequest request3 = new LeaveRequest("Charlie", 10);
// 处理请假请求
manager.processRequest(request1);
manager.processRequest(request2);
manager.processRequest(request3);
}
}
使用场景
责任链模式适用于以下情况:
- 有多个对象可以处理请求,但是我们并不知道具体哪个对象会处理它。
- 想在不明确指定接收者的情况下向多个对象中的一个提交请求。
- 需要动态指定一组对象处理请求的顺序。
总结
责任链模式通过将请求沿着处理者链传递,使得请求可以被链中的一个或多个处理者处理。这种方式不仅可以简化请求的处理流程,还能支持动态配置处理者的顺序。责任链模式非常适合用于处理需要多级审批或顺序处理的业务逻辑。
以上就是责任链模式的一个实现案例,希望这篇文章能帮助你理解责任链模式的使用方式及其优势。
评论区