责任链 将一系列处理器串成一条链路;请求顺着链路依次传递,每个处理器判断是否处理请求,处理完毕放行至下一环,或者终止链路,请求发送者不需要清楚哪一个类执行业务。
典型落地场景:
- 接口参数校验链
- 登录权限校验、网关过滤器
- 多级审批(员工→主管→经理)
- 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("所有参数校验通过");
}
}