项目设计模式:责任链模式

责任链模式(Chain of Responsibility)

它的核心思想就是:将请求沿着一条链传递,每个节点(处理器)决定是否处理,或者传递给下一个节点。

🌟 实际应用场景

  1. 日常业务开发中的典型应用
  2. 请求参数校验(比如用户注册流程,一步步校验手机号、验证码、用户名是否合法)
  3. 权限校验、风控拦截
  4. 审批流(如OA审批,一级主管 → 部门经理 → 总经理)
  5. 日志拦截链
  6. 过滤器链(Servlet Filter、Spring Interceptor)
  7. 数据处理管道(ETL流程,数据逐步清洗、转换)
  8. 异常处理链

Java责任链简单示例

比如:一个审批流程,金额不同,审批人不同

  1. 定义 Handler 接口
java 复制代码
public abstract class Approver {
    protected Approver next;

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

    public abstract void approve(int amount);
}
  1. 定义具体处理者
java 复制代码
public class Manager extends Approver {
    @Override
    public void approve(int amount) {
        if (amount <= 1000) {
            System.out.println("Manager approved: " + amount);
        } else if (next != null) {
            next.approve(amount);
        }
    }
}
java 复制代码
```java
public class Director extends Approver {
    @Override
    public void approve(int amount) {
        if (amount <= 5000) {
            System.out.println("Director approved: " + amount);
        } else if (next != null) {
            next.approve(amount);
        }
    }
}
java 复制代码
public class CEO extends Approver {
    @Override
    public void approve(int amount) {
        if (amount > 5000) {
            System.out.println("CEO approved: " + amount);
        } else if (next != null) {
            next.approve(amount);
        }
    }
}
  1. 使用
java 复制代码
public class Main {
    public static void main(String[] args) {
        Approver manager = new Manager();
        Approver director = new Director();
        Approver ceo = new CEO();

        manager.setNext(director);
        director.setNext(ceo);

        manager.approve(800);   // Manager审批
        manager.approve(3000);  // Director审批
        manager.approve(10000); // CEO审批
    }
}

🚀 责任链模式优势

✅ 解耦请求发送者与处理者

✅ 结构清晰、易扩展(加新节点不用动原来的代码)

✅ 动态组合链路,灵活可配置(比如在 Spring 中可通过配置文件决定链路顺序)

🧩 现实框架中的责任链

框架/库 责任链体现

Servlet Filter Chain

Spring MVC HandlerInterceptor链

MyBatis插件 InterceptorChain

Netty ChannelPipeline

日志系统 log4j Appender链式结构

🚀 整体设计

✅ Handler接口:定义每个处理器

✅ Context对象:贯穿整个链,传递数据

✅ Chain注册器:自动组装链

✅ 异常中断机制:某个环节失败,后续不执行

✅ 链执行器:开始执行链

📄 完整示例代码

  1. 定义 Handler 接口
java 复制代码
public interface ChainHandler {
    void handle(ChainContext context);
}
  1. 定义 Chain Context
java 复制代码
public class ChainContext {
    private boolean stopped = false;
    private Map<String, Object> data = new HashMap<>();

    public void stop() {
        this.stopped = true;
    }

    public boolean isStopped() {
        return stopped;
    }

    public void set(String key, Object value) {
        data.put(key, value);
    }

    public Object get(String key) {
        return data.get(key);
    }
}
  1. 创建 Chain Executor
java 复制代码
public class ChainExecutor {
    private final List<ChainHandler> handlers = new ArrayList<>();

    public void addHandler(ChainHandler handler) {
        handlers.add(handler);
    }

    public void execute(ChainContext context) {
        for (ChainHandler handler : handlers) {
            if (context.isStopped()) {
                System.out.println("链路中断");
                break;
            }
            handler.handle(context);
        }
    }
}
  1. 实现几个业务 Handler
java 复制代码
public class LoginCheckHandler implements ChainHandler {
    @Override
    public void handle(ChainContext context) {
        System.out.println("① 登录校验");
        String user = (String) context.get("user");
        if (user == null || user.isEmpty()) {
            System.out.println("❌ 用户未登录,流程中断");
            context.stop();
        }
    }
}
java 复制代码
public class RiskControlHandler implements ChainHandler {
    @Override
    public void handle(ChainContext context) {
        System.out.println("② 风控校验");
        int riskScore = (int) context.getOrDefault("risk", 0);
        if (riskScore > 80) {
            System.out.println("❌ 风险过高,流程中断");
            context.stop();
        }
    }
}
java 复制代码
public class DataProcessHandler implements ChainHandler {
    @Override
    public void handle(ChainContext context) {
        System.out.println("③ 数据处理完成 ✅");
    }
}
  1. 测试运行
java 复制代码
public class Main {
    public static void main(String[] args) {
        ChainExecutor executor = new ChainExecutor();

        // 注册处理器
        executor.addHandler(new LoginCheckHandler());
        executor.addHandler(new RiskControlHandler());
        executor.addHandler(new DataProcessHandler());

        // 创建上下文
        ChainContext context = new ChainContext();
        context.set("user", "达滔");
        context.set("risk", 60);

        executor.execute(context);

        System.out.println("====== 再测试风险过高中断 ======");

        ChainContext context2 = new ChainContext();
        context2.set("user", "达滔");
        context2.set("risk", 90); // 高风险

        executor.execute(context2);
    }
}

🎯 运行效果

① 登录校验

② 风控校验

③ 数据处理完成 ✅

====== 再测试风险过高中断 ======

① 登录校验

② 风控校验

❌ 风险过高,流程中断

链路中断

🌈 后续拓展

这个链你可以很轻松地改造成:

Spring Bean 自动注册 → 每个 ChainHandler 注入到 Spring 容器

链路配置 → 从数据库/配置文件读取 handler 顺序

异步链路 → 改为 CompletableFuture 支持异步流

责任链分组 → 多个 ChainExecutor 分组,比如风控链、审批链

相关推荐
三金C_C5 小时前
单例模式解析
单例模式·设计模式·线程锁
ShareBeHappy_Qin7 小时前
设计模式——设计模式理念
java·设计模式
木子庆五9 小时前
Android设计模式之代理模式
android·设计模式·代理模式
前端_ID林11 小时前
前端必须知道的设计模式
设计模式
麦客奥德彪13 小时前
设计模式分类与应用指南
设计模式
小宋要上岸13 小时前
设计模式-单例模式
单例模式·设计模式
程序员JerrySUN14 小时前
设计模式 Day 1:单例模式(Singleton Pattern)详解
单例模式·设计模式
古力德16 小时前
代码重构之[过长参数列表]
设计模式·代码规范
OpenSeek18 小时前
【设计模式】面向对象的设计模式概述
设计模式·c#·设计原则
十五年专注C++开发19 小时前
设计模式之适配器模式(二):STL适配器
c++·设计模式·stl·适配器模式·包装器