Java责任链模式
外观
概述[编辑 | 编辑源代码]
责任链模式是一种行为设计模式,允许将请求沿着处理链传递,直到有一个处理者能够处理它。这种模式解耦了请求的发送者和接收者,允许多个对象都有机会处理请求。
主要特点:
- 请求沿着链传递,直到被处理或到达链尾
- 每个处理者决定是否处理请求或传递给下一个处理者
- 动态添加或修改处理链
结构[编辑 | 编辑源代码]
责任链模式包含以下核心组件:
- Handler(抽象处理者):定义处理请求的接口
- ConcreteHandler(具体处理者):实现处理逻辑,决定是否处理请求或传递
- Client(客户端):创建处理链并提交请求
代码示例[编辑 | 编辑源代码]
以下是一个简单的审批流程示例:
// 抽象处理者
abstract class Approver {
protected Approver successor;
public void setSuccessor(Approver successor) {
this.successor = successor;
}
public abstract void processRequest(PurchaseRequest request);
}
// 具体处理者:经理
class Manager extends Approver {
@Override
public void processRequest(PurchaseRequest request) {
if (request.getAmount() <= 1000) {
System.out.println("Manager approves purchase #" + request.getNumber());
} else if (successor != null) {
successor.processRequest(request);
}
}
}
// 具体处理者:总监
class Director extends Approver {
@Override
public void processRequest(PurchaseRequest request) {
if (request.getAmount() <= 5000) {
System.out.println("Director approves purchase #" + request.getNumber());
} else if (successor != null) {
successor.processRequest(request);
}
}
}
// 请求类
class PurchaseRequest {
private int number;
private double amount;
public PurchaseRequest(int number, double amount) {
this.number = number;
this.amount = amount;
}
// getters...
}
// 客户端
public class ChainOfResponsibilityDemo {
public static void main(String[] args) {
Approver manager = new Manager();
Approver director = new Director();
manager.setSuccessor(director);
// 创建不同金额的采购请求
manager.processRequest(new PurchaseRequest(1, 500));
manager.processRequest(new PurchaseRequest(2, 2500));
manager.processRequest(new PurchaseRequest(3, 6000));
}
}
输出结果:
Manager approves purchase #1 Director approves purchase #2
实际应用场景[编辑 | 编辑源代码]
责任链模式在以下场景中特别有用:
1. 多级审批系统:如采购审批、请假审批等 2. 事件处理:如GUI中的事件冒泡机制 3. 日志记录:不同级别的日志由不同处理器处理 4. 异常处理:try-catch块形成的处理链 5. Web过滤器:Servlet过滤器链
变体与注意事项[编辑 | 编辑源代码]
纯与不纯的责任链[编辑 | 编辑源代码]
- 纯责任链:请求必须被某个处理者处理
- 不纯责任链:请求可能不被任何处理者处理
性能考虑[编辑 | 编辑源代码]
- 避免过长的处理链影响性能
- 可以考虑短路机制(找到处理者后立即终止)
与其他模式的关系[编辑 | 编辑源代码]
数学表示[编辑 | 编辑源代码]
责任链可以形式化为: 解析失败 (语法错误): {\displaystyle C = \{h_1, h_2, ..., h_n\} \\ \forall r \in R, \exists h_i \in C : h_i(r) \neq \emptyset \Rightarrow \text{处理成功} } 其中:
- 是处理链
- 是处理者
- 是所有可能的请求集合
高级主题[编辑 | 编辑源代码]
动态链构建[编辑 | 编辑源代码]
可以通过配置文件或依赖注入框架动态构建处理链:
// 使用Spring框架的示例
@Configuration
public class ChainConfig {
@Bean
@Order(1)
public Handler firstHandler() {
return new FirstHandler();
}
@Bean
@Order(2)
public Handler secondHandler() {
return new SecondHandler();
}
}
中断处理[编辑 | 编辑源代码]
某些实现可能允许处理者中断链的继续传递:
public void processRequest(Request request) {
if (canHandle(request)) {
handle(request);
return; // 中断传递
}
if (successor != null) {
successor.processRequest(request);
}
}
最佳实践[编辑 | 编辑源代码]
1. 考虑使用构建器模式来创建复杂的处理链 2. 为处理链添加监控和日志记录能力 3. 避免形成循环链 4. 考虑使用空对象模式处理未被处理的请求