跳转到内容

Java责任链模式

来自代码酷

模板:Note

概述[编辑 | 编辑源代码]

责任链模式是一种行为设计模式,允许将请求沿着处理链传递,直到有一个处理者能够处理它。这种模式解耦了请求的发送者和接收者,允许多个对象都有机会处理请求。

主要特点:

  • 请求沿着链传递,直到被处理或到达链尾
  • 每个处理者决定是否处理请求或传递给下一个处理者
  • 动态添加或修改处理链

结构[编辑 | 编辑源代码]

责任链模式包含以下核心组件:

  • Handler(抽象处理者):定义处理请求的接口
  • ConcreteHandler(具体处理者):实现处理逻辑,决定是否处理请求或传递
  • Client(客户端):创建处理链并提交请求

classDiagram class Handler { +successor: Handler +handleRequest(request) +setSuccessor(successor) } class ConcreteHandlerA { +handleRequest(request) } class ConcreteHandlerB { +handleRequest(request) } Handler <|-- ConcreteHandlerA Handler <|-- ConcreteHandlerB Handler o-- Handler : successor

代码示例[编辑 | 编辑源代码]

以下是一个简单的审批流程示例:

// 抽象处理者
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{处理成功} } 其中:

  • C是处理链
  • hi是处理者
  • R是所有可能的请求集合

高级主题[编辑 | 编辑源代码]

动态链构建[编辑 | 编辑源代码]

可以通过配置文件或依赖注入框架动态构建处理链:

// 使用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. 考虑使用空对象模式处理未被处理的请求

模板:JavaDesignPatterns