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("所有参数校验通过");
    }
}
相关推荐
阿无,2 天前
设计模式之责任链模式
设计模式·责任链模式
莫得感情 o15 天前
设计模式 17 · 责任链模式
设计模式·责任链模式
晚安code16 天前
责任链模式是什么?适用场景 + 实战示例,告别 if-else 泥潭
责任链模式
geovindu1 个月前
Java: Chain of Responsibility Pattern
java·开发语言·后端·设计模式·责任链模式·行为模式
geovindu1 个月前
CSharp:Chain of Responsibility Pattern
开发语言·后端·设计模式·c#·.net·责任链模式·行为模式
谢栋_1 个月前
设计模式从入门到精通之(七)责任链模式
java·设计模式·责任链模式
wuqingshun3141591 个月前
什么是责任链模式,一般用在什么场景?
java·责任链模式
ttod_qzstudio1 个月前
【软考设计模式】责任链模式:请求传递的多级处理与发送接收解耦精讲
设计模式·责任链模式
c238561 个月前
第三篇文档:多级信件分拣流水线 —— 责任链模式完美封装 System V 消息队列
运维·服务器·责任链模式