JAVA责任链模式

责任链 将一系列处理器串成一条链路;请求顺着链路依次传递,每个处理器判断是否处理请求,处理完毕放行至下一环,或者终止链路,请求发送者不需要清楚哪一个类执行业务

典型落地场景:

  1. 接口参数校验链
  2. 登录权限校验、网关过滤器
  3. 多级审批(员工→主管→经理)
  4. Spring‑MVC Filter、Gateway 全局过滤器、拦截器

标准四角色

抽象处理器 Handler 持有下一个处理器,定义处理方法

具体处理器 ConcreteHandler 实现自身业务,可放行 / 终止链条

请求实体 Request 需要传递的数据

客户端:组装处理器链条、发起请求

代码实现

请求实体

java 复制代码
import lombok.Data;

@Data
public class TrainQueryRequest {
    //出发站点
    private String startStation;
    //到达站点
    private String endStation;
    //乘车日期
    private String date;
}

抽象父处理器

java 复制代码
public abstract class BaseHandler {

    //保存下一个处理器
    protected BaseHandler nextHandler;

    //设置后继节点
    public void setNext(BaseHandler nextHandler){
        this.nextHandler = nextHandler;
    }

    //处理请求,由子类实现
    public abstract void handle(TrainQueryRequest request);
}

多个具体处理器

java 复制代码
//校验出发站
public class StartStationHandler extends BaseHandler {
    @Override
    public void handle(TrainQueryRequest request) {
        if (request.getStartStation() == null || request.getStartStation().trim().isEmpty()){
            throw new RuntimeException("出发站点不能为空");
        }
        //交给下一环
        if(nextHandler != null){
            nextHandler.handle(request);
        }
    }
}



//校验终点站
public class EndStationHandler extends BaseHandler {
    @Override
    public void handle(TrainQueryRequest request) {
        if (request.getEndStation() == null || request.getEndStation().trim().isEmpty()){
            throw new RuntimeException("到达站点不能为空");
        }
        if(nextHandler != null){
            nextHandler.handle(request);
        }
    }
}



//校验日期
public class DateCheckHandler extends BaseHandler {
    @Override
    public void handle(TrainQueryRequest request) {
        if (request.getDate() == null || request.getDate().trim().isEmpty()){
            throw new RuntimeException("乘车日期不能为空");
        }
        if(nextHandler != null){
            nextHandler.handle(request);
        }
    }
}

客户端组装链条执行

java 复制代码
public class ClientTest {
    public static void main(String[] args) {
        //1. 创建处理器
        BaseHandler startCheck = new StartStationHandler();
        BaseHandler endCheck = new EndStationHandler();
        BaseHandler dateCheck = new DateCheckHandler();

        //2. 串联责任链:出发站 → 终点站 → 日期
        startCheck.setNext(endCheck);
        endCheck.setNext(dateCheck);

        //3. 构造请求
        TrainQueryRequest req = new TrainQueryRequest();
        req.setStartStation("北京");
        req.setEndStation("上海");
        req.setDate("2026-08-05");

        //4. 发起请求
        startCheck.handle(req);
        System.out.println("所有参数校验通过");
    }
}
相关推荐
geovindu6 天前
Java: Chain of Responsibility Pattern
java·开发语言·后端·设计模式·责任链模式·行为模式
geovindu7 天前
CSharp:Chain of Responsibility Pattern
开发语言·后端·设计模式·c#·.net·责任链模式·行为模式
谢栋_13 天前
设计模式从入门到精通之(七)责任链模式
java·设计模式·责任链模式
wuqingshun31415922 天前
什么是责任链模式,一般用在什么场景?
java·责任链模式
ttod_qzstudio22 天前
【软考设计模式】责任链模式:请求传递的多级处理与发送接收解耦精讲
设计模式·责任链模式
c2385624 天前
第三篇文档:多级信件分拣流水线 —— 责任链模式完美封装 System V 消息队列
运维·服务器·责任链模式
未若君雅裁2 个月前
责任链模式详解:从Servlet过滤器到订单创建流程
servlet·责任链模式
许彰午2 个月前
责任链模式实战——同一个框架里的两种链
java·开发语言·责任链模式
老码观察2 个月前
设计模式实战解读(九):责任链模式——流水线上层层把关的艺术
java·设计模式·责任链模式