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

责任链模式(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 分组,比如风控链、审批链

相关推荐
静水流深_沧海一粟16 小时前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式
StarkCoder16 小时前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命
设计模式
阿星AI工作室1 天前
给openclaw龙虾造了间像素办公室!实时看它写代码、摸鱼、修bug、写日报,太可爱了吧!
前端·人工智能·设计模式
_哆啦A梦2 天前
Vibe Coding 全栈专业名词清单|设计模式·基础篇(创建型+结构型核心名词)
前端·设计模式·vibecoding
阿闽ooo5 天前
中介者模式打造多人聊天室系统
c++·设计模式·中介者模式
小米4965 天前
js设计模式 --- 工厂模式
设计模式
逆境不可逃5 天前
【从零入门23种设计模式08】结构型之组合模式(含电商业务场景)
线性代数·算法·设计模式·职场和发展·矩阵·组合模式
驴儿响叮当20105 天前
设计模式之状态模式
设计模式·状态模式
电子科技圈5 天前
XMOS推动智能音频等媒体处理技术从嵌入式系统转向全新边缘计算
人工智能·mcu·物联网·设计模式·音视频·边缘计算·iot
徐先生 @_@|||6 天前
安装依赖三方exe/msi的软件设计模式
设计模式