深入理解设计模式之职责链模式

深入理解设计模式之:职责链模式(Chain of Responsibility Pattern)

一、什么是职责链模式?

职责链模式是一种行为型设计模式。它将请求的发送者和接收者解耦,让多个接收对象都有机会处理这个请求。将这些接收对象连成一条链,请求沿着链传递,直到有对象处理它为止。

核心思想:
请求发送者无需关心请求由谁处理,链上的每个节点都可以选择处理请求或将其传递给下一个节点。


二、应用场景

  • Web 框架中的过滤器链、拦截器链(如 Spring MVC Filter、Servlet Filter)
  • 日志处理链(不同级别日志处理器)
  • 审批流程(如请假、报销等多级审批)
  • 责任分级处理(如异常处理、权限校验)

三、模式结构

  • Handler(抽象处理者):定义处理请求的接口,并持有下一个处理者的引用
  • ConcreteHandler(具体处理者):实现处理逻辑,决定是否处理请求或传递给下一个处理者
  • Client(客户端):创建链并发起请求

四、UML 类图

+------------------+
|    Handler       |<-------------------+
+------------------+                    |
| next: Handler    |                    |
| +setNext()       |                    |
| +handleRequest() |                    |
+------------------+                    |
        /_\                              |
         |                               |
+---------------------+         +---------------------+
| ConcreteHandlerA    |         | ConcreteHandlerB    |
+---------------------+         +---------------------+
| +handleRequest()    |         | +handleRequest()    |
+---------------------+         +---------------------+

五、Java 实现代码示例

1. 抽象处理者

public abstract class Handler {
    protected Handler next;

    public void setNext(Handler next) {
        this.next = next;
    }

    public abstract void handleRequest(String request);
}

2. 具体处理者

public class AuthHandler extends Handler {
    @Override
    public void handleRequest(String request) {
        if (request.equals("auth")) {
            System.out.println("AuthHandler 处理了请求");
        } else if (next != null) {
            next.handleRequest(request);
        } else {
            System.out.println("请求未被处理");
        }
    }
}

public class LoggingHandler extends Handler {
    @Override
    public void handleRequest(String request) {
        if (request.equals("log")) {
            System.out.println("LoggingHandler 处理了请求");
        } else if (next != null) {
            next.handleRequest(request);
        } else {
            System.out.println("请求未被处理");
        }
    }
}

public class BusinessHandler extends Handler {
    @Override
    public void handleRequest(String request) {
        if (request.equals("business")) {
            System.out.println("BusinessHandler 处理了请求");
        } else if (next != null) {
            next.handleRequest(request);
        } else {
            System.out.println("请求未被处理");
        }
    }
}

3. 客户端组装链并发起请求

public class Main {
    public static void main(String[] args) {
        Handler auth = new AuthHandler();
        Handler log = new LoggingHandler();
        Handler business = new BusinessHandler();

        // 组装链:auth -> log -> business
        auth.setNext(log);
        log.setNext(business);

        // 发起不同请求
        auth.handleRequest("auth");      // 输出:AuthHandler 处理了请求
        auth.handleRequest("log");       // 输出:LoggingHandler 处理了请求
        auth.handleRequest("business");  // 输出:BusinessHandler 处理了请求
        auth.handleRequest("other");     // 输出:请求未被处理
    }
}

六、扩展用法

1. 动态链路组装

链可以在运行时动态组装,灵活应对不同业务场景。

2. 责任链终止

链上的某个节点可以选择终止请求传递(如 return),也可以继续传递。

3. Spring 框架中的应用

Spring Security、Spring MVC Filter、AOP 拦截器等大量用到职责链思想。


七、优缺点

优点:

  • 解耦请求发送者和处理者
  • 动态组合链路,灵活扩展
  • 符合开闭原则,易于添加新处理者

缺点:

  • 可能导致链过长,影响性能
  • 调试和链路追踪相对复杂

八、总结

职责链模式是实现请求处理解耦、灵活扩展的经典方案,广泛应用于中间件、审批流、日志处理等场景。掌握职责链模式有助于编写高内聚、低耦合的代码结构。

建议:

  • 适合多级处理、可扩展的业务场景
  • 注意链路长度和性能监控

如需更多设计模式讲解或源码分析,欢迎留言交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值