当前位置:首页 > Java > 正文

责任链模式详解(Java语言实现责任链模式完整教程)

在软件开发中,责任链模式(Chain of Responsibility Pattern)是一种非常实用的行为型设计模式。它允许你将请求沿着处理者链进行传递,直到有对象处理它为止。这种模式可以有效解耦请求的发送者和接收者,让多个对象都有机会处理请求。

本教程将用通俗易懂的方式,手把手教你如何在Java语言中实现责任链模式,即使你是编程小白,也能轻松掌握!

什么是责任链模式?

想象一下你在公司申请请假:先提交给组长,如果组长不能批准(比如超过3天),就转交给经理;如果经理也不能批准(比如超过10天),就继续转交给总监……这就是一个典型的责任链。

责任链模式详解(Java语言实现责任链模式完整教程) 责任链模式 Java设计模式 行为型设计模式 Java责任链实现 第1张

Java设计模式中,责任链模式的核心思想是:

  • 每个处理者都持有对下一个处理者的引用;
  • 处理者决定是否处理请求,或者将请求传递给下一个处理者;
  • 客户端只需将请求发送给链上的第一个处理者即可。

责任链模式的结构

责任链模式通常包含以下角色:

  • Handler(抽象处理者):定义处理请求的接口,并持有下一个处理者的引用;
  • ConcreteHandler(具体处理者):实现具体的处理逻辑,判断是否能处理请求,否则转发;
  • Client(客户端):创建处理链并发起请求。

Java代码实现示例

下面我们通过一个“审批请假”的例子来演示Java责任链实现

1. 定义抽象处理者(Handler)

public abstract class Approver {    protected Approver nextApprover; // 下一个处理者    public void setNextApprover(Approver approver) {        this.nextApprover = approver;    }    // 处理请求的抽象方法    public abstract void processRequest(LeaveRequest request);}

2. 定义请求类(LeaveRequest)

public class LeaveRequest {    private String employeeName;    private int days;    public LeaveRequest(String employeeName, int days) {        this.employeeName = employeeName;        this.days = days;    }    // Getter 方法    public String getEmployeeName() { return employeeName; }    public int getDays() { return days; }}

3. 实现具体处理者

组长(TeamLeader):可批准 ≤ 3 天的假期

public class TeamLeader extends Approver {    @Override    public void processRequest(LeaveRequest request) {        if (request.getDays() <= 3) {            System.out.println("组长批准了 " + request.getEmployeeName() +                              " 的 " + request.getDays() + " 天假期。");        } else if (nextApprover != null) {            System.out.println("组长无法批准,转交经理处理...");            nextApprover.processRequest(request);        }    }}

经理(Manager):可批准 ≤ 7 天的假期

public class Manager extends Approver {    @Override    public void processRequest(LeaveRequest request) {        if (request.getDays() <= 7) {            System.out.println("经理批准了 " + request.getEmployeeName() +                              " 的 " + request.getDays() + " 天假期。");        } else if (nextApprover != null) {            System.out.println("经理无法批准,转交总监处理...");            nextApprover.processRequest(request);        }    }}

总监(Director):可批准任意天数

public class Director extends Approver {    @Override    public void processRequest(LeaveRequest request) {        System.out.println("总监批准了 " + request.getEmployeeName() +                          " 的 " + request.getDays() + " 天假期。");    }}

4. 客户端测试

public class Client {    public static void main(String[] args) {        // 创建处理者        TeamLeader teamLeader = new TeamLeader();        Manager manager = new Manager();        Director director = new Director();        // 构建责任链        teamLeader.setNextApprover(manager);        manager.setNextApprover(director);        // 发起不同天数的请假请求        LeaveRequest request1 = new LeaveRequest("张三", 2);        teamLeader.processRequest(request1); // 组长处理        System.out.println("-------------------");        LeaveRequest request2 = new LeaveRequest("李四", 5);        teamLeader.processRequest(request2); // 转交经理        System.out.println("-------------------");        LeaveRequest request3 = new LeaveRequest("王五", 10);        teamLeader.processRequest(request3); // 转交总监    }}

运行结果

组长批准了 张三 的 2 天假期。-------------------组长无法批准,转交经理处理...经理批准了 李四 的 5 天假期。-------------------组长无法批准,转交经理处理...经理无法批准,转交总监处理...总监批准了 王五 的 10 天假期。

责任链模式的优点与适用场景

✅ 优点

  • 解耦:发送者无需知道哪个对象会处理请求;
  • 灵活性:可以在运行时动态调整链的结构;
  • 单一职责:每个处理者只关注自己的处理逻辑。

📌 适用场景

  • 多个对象可以处理同一请求,但具体由谁处理在运行时决定;
  • 需要按顺序处理请求(如审批流、日志过滤、异常处理等);
  • 希望避免请求发送者与接收者之间的紧耦合。

总结

通过本教程,我们深入学习了责任链模式Java语言中的实现方式。作为重要的行为型设计模式之一,它在实际项目中应用广泛,尤其适合构建灵活、可扩展的请求处理流程。

记住关键点:每个处理者决定自己是否处理,否则传递下去。掌握这一思想,你就能轻松应对各种复杂的业务审批或过滤场景!

现在,快去你的项目中试试Java责任链实现吧!