
优点 | 缺点 |
|---|---|
1. 解耦请求发送者和接收者。 | 1. 请求可能未被处理(需兜底机制)。 |
2. 动态增删处理节点,灵活扩展。 | 2. 链过长时性能下降。 |
3. 单一职责原则,每个处理者专注自身逻辑。 | 3. 调试复杂,需跟踪链的传递路径。 |
/**
* 请求类:封装请求的详细信息
*/
public class Request {
private final String content;
private final RequestType type;
public Request(String content, RequestType type) {
this.content = content;
this.type = type;
}
public String getContent() {
return content;
}
public RequestType getType() {
return type;
}
public enum RequestType {
LEAVE, // 请假请求
PURCHASE // 采购请求
}
}/**
* 处理者接口:定义处理请求的方法和设置下一处理者的方法
*/
public interface Handler {
void handleRequest(Request request);
void setNextHandler(Handler next);
}/**
* 具体处理者:直属领导(处理请假请求)
*/
public class SupervisorHandler implements Handler {
private Handler nextHandler;
@Override
public void setNextHandler(Handler next) {
this.nextHandler = next;
}
@Override
public void handleRequest(Request request) {
if (request.getType() == Request.RequestType.LEAVE && request.getContent().contains("病假")) {
System.out.println("直属领导批准病假请求");
} else if (nextHandler != null) {
nextHandler.handleRequest(request); // 传递给下一处理者
} else {
System.out.println("请求无法处理:无后续审批人");
}
}
}
/**
* 具体处理者:部门经理(处理采购请求)
*/
public class DepartmentManagerHandler implements Handler {
private Handler nextHandler;
@Override
public void setNextHandler(Handler next) {
this.nextHandler = next;
}
@Override
public void handleRequest(Request request) {
if (request.getType() == Request.RequestType.PURCHASE && request.getContent().contains("预算内")) {
System.out.println("部门经理批准预算内采购");
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
} else {
System.out.println("请求需提交至更高层级审批");
}
}
}
/**
* 具体处理者:总经理(兜底处理)
*/
public class GeneralManagerHandler implements Handler {
@Override
public void setNextHandler(Handler next) {
// 最后一环,无下一处理者
}
@Override
public void handleRequest(Request request) {
System.out.println("总经理处理所有未决请求:" + request.getContent());
}
}public class Client {
public static void main(String[] args) {
// 创建处理者
Handler supervisor = new SupervisorHandler();
Handler deptManager = new DepartmentManagerHandler();
Handler generalManager = new GeneralManagerHandler();
// 构建责任链:直属领导 → 部门经理 → 总经理
supervisor.setNextHandler(deptManager);
deptManager.setNextHandler(generalManager);
// 创建请求
Request leaveRequest = new Request("病假3天", Request.RequestType.LEAVE);
Request purchaseRequest = new Request("购买办公用品(预算内)", Request.RequestType.PURCHASE);
Request specialRequest = new Request("购买服务器(预算外)", Request.RequestType.PURCHASE);
// 处理请求
System.out.println("===== 处理病假请求 =====");
supervisor.handleRequest(leaveRequest);
System.out.println("\n===== 处理预算内采购 =====");
supervisor.handleRequest(purchaseRequest);
System.out.println("\n===== 处理预算外采购 =====");
supervisor.handleRequest(specialRequest);
}
}===== 处理病假请求 =====
直属领导批准病假请求
===== 处理预算内采购 =====
部门经理批准预算内采购
===== 处理预算外采购 =====
总经理处理所有未决请求:购买服务器(预算外)+----------------+ +----------------+
| Handler | <------+ | Handler |
+----------------+ +----------------+
| +handleRequest() | +handleRequest()|
| +setNextHandler() | +setNextHandler()|
+----------------+ +----------------+
^ |
| |
+----------------+ +----------------+
| ConcreteHandlerA | ConcreteHandlerB|
+----------------+ +----------------+
| +handleRequest() | +handleRequest()|
+----------------+ +----------------+责任链模式在 Java 生态中的典型应用包括:
FilterChain 处理 HTTP 请求。
Appender 链式输出日志。
掌握该模式能显著提升系统的可扩展性和维护性,尤其在需要动态调整处理流程的场景中。