目录
定义
结构
工作流程
优点
应用场景
示例
责任链模式(Chain of Responsibility)是一种行为型设计模式,其主要目的是通过为请求创建一个对象链来避免请求的发送者和接收者之间的耦合关系。在这种模式下,多个对象都有机会处理这个请求,它们被连接成一条链,请求则沿着这条链传递,直到有一个对象能够处理它为止。以下是对责任链模式的详细解析:
责任链模式将请求的发送者和接收者解耦,使得多个对象都有机会处理这个请求,并且将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
在责任链模式中,通常包含以下几个角色:
责任链模式通常用于以下场景:
以下是一个简单的责任链模式示例,模拟了一个公司处理员工请假请求的过程:
在这个示例中,客户端将请假请求发送给项目经理(链的第一个处理者)。项目经理首先检查自己是否能够处理该请求(即请假天数是否在其审批权限范围内)。如果能够处理,则直接处理;如果不能处理,则将该请求传递给部门经理(链的下一个处理者)。部门经理继续这个过程,直到请求被处理或传递到链的末尾。
责任链模式是一种非常有用的设计模式,它可以帮助我们构建灵活且可扩展的系统。通过避免请求的发送者和接收者之间的直接耦合,我们可以更容易地添加新的处理者或修改现有处理者的顺序,从而满足不断变化的业务需求。
在Java中实现责任链模式来模拟公司处理员工请假请求的过程,我们需要定义几个类:LeaveRequest
(请假请求类),Handler
(处理者接口),以及具体的处理者类(如ProjectManager
和DepartmentHead
)。下面是一个简单的实现示例:
首先,我们定义请假请求类LeaveRequest
:
public class LeaveRequest {
private int numberOfDays;
private String employeeName;
public LeaveRequest(int numberOfDays, String employeeName) {
this.numberOfDays = numberOfDays;
this.employeeName = employeeName;
}
public int getNumberOfDays() {
return numberOfDays;
}
public String getEmployeeName() {
return employeeName;
}
@Override
public String toString() {
return "LeaveRequest{" +
"numberOfDays=" + numberOfDays +
", employeeName='" + employeeName + '\'' +
'}';
}
}
然后,定义处理者接口Handler
:
public interface Handler {
// 处理请假请求的方法
void handleRequest(LeaveRequest leaveRequest);
// 设置下一个处理者
void setNextHandler(Handler handler);
}
接下来,定义具体的处理者类,如ProjectManager
和DepartmentHead
:
public class ProjectManager implements Handler {
private Handler nextHandler;
@Override
public void handleRequest(LeaveRequest leaveRequest) {
if (leaveRequest.getNumberOfDays() <= 3) {
System.out.println("Project Manager approved the leave request for " + leaveRequest.getEmployeeName());
} else {
if (nextHandler != null) {
nextHandler.handleRequest(leaveRequest);
} else {
System.out.println("Leave request cannot be approved by anyone.");
}
}
}
@Override
public void setNextHandler(Handler handler) {
this.nextHandler = handler;
}
}
public class DepartmentHead implements Handler {
private Handler nextHandler;
@Override
public void handleRequest(LeaveRequest leaveRequest) {
if (leaveRequest.getNumberOfDays() <= 7) {
System.out.println("Department Head approved the leave request for " + leaveRequest.getEmployeeName());
} else {
if (nextHandler != null) {
nextHandler.handleRequest(leaveRequest);
} else {
System.out.println("Leave request cannot be approved by anyone.");
}
}
}
@Override
public void setNextHandler(Handler handler) {
this.nextHandler = handler;
}
}
最后,我们编写一个客户端类来测试这个责任链:
public class ChainPatternDemo {
private static Handler getChain() {
// 创建责任链
Handler projectManager = new ProjectManager();
Handler departmentHead = new DepartmentHead();
// 设置链的顺序
projectManager.setNextHandler(departmentHead);
return projectManager;
}
public static void main(String[] args) {
// 创建请求
LeaveRequest request1 = new LeaveRequest(2, "John Doe");
LeaveRequest request2 = new LeaveRequest(5, "Jane Smith");
LeaveRequest request3 = new LeaveRequest(10, "Alice Johnson");
// 获取链的入口
Handler handler = getChain();
// 发送请求
handler.handleRequest(request1);
handler.handleRequest(request2);
handler.handleRequest(request3);
}
}
在这个例子中,我们创建了一个责任链,其中ProjectManager
是链的第一个处理者,它负责处理3天或更少的请假请求。如果请求天数超过3天,则它会将请求传递给链中的下一个处理者——DepartmentHead
。DepartmentHead
可以处理最多7天的请假请求。如果请求天数超过7天,并且链中没有更多的处理者,则会打印一条消息表示请假请求无法被批准。
运行ChainPatternDemo
类将演示责任链如何工作。