Java接口本身不能直接实现责任链,但可通过定义统一处理器接口(如Handler<T>)、多个实现类持有next引用并显式串联,在运行时构建责任链,核心是“能处理则处理,否则传递给next”。

Java 接口中本身不能直接实现责任链,但可以通过定义统一接口 + 多个实现类 + 显式串联逻辑的方式,在运行时构建责任链。核心是让每个实现类持有下一个处理器的引用,并约定“能处理就处理,不能就传递”。
定义统一的处理器接口
用一个函数式接口或普通接口声明处理方法,返回 boolean 表示是否已处理(或用 Optional<Result> 等更明确的语义):
public interface Handler {
boolean handle(Request request);
}
也可以带泛型增强类型安全:
public interface Handler<T> {
boolean handle(T request);
}
实现多个具体处理器并支持链式设置
每个实现类内部保存 next 引用,构造时或通过 setter 设置下一个处理器。关键点:不强制要求必须有 next,末端可为 null;处理逻辑中主动调用 next.handle(...) 实现传递:
立即学习“Java免费学习笔记(深入)”;
- 推荐在构造器中传入 next,链初始化更清晰
- 避免在 handle 中 new 下一个实例(耦合、难测试)
- 建议判空再调用 next,防止 NPE
public class AuthHandler implements Handler<Request> {
private final Handler<Request> next;
public AuthHandler(Handler<Request> next) {
this.next = next;
}
@Override
public boolean handle(Request request) {
if (request.getToken() == null) {
System.out.println("认证失败");
return false;
}
System.out.println("认证通过");
return next != null && next.handle(request); // 传递给下一个
}
}
手动组装责任链(推荐方式)
不在接口里硬编码顺序,而是在业务代码或配置中显式串联,灵活且易测:
Handler<Request> chain = new AuthHandler(
new RateLimitHandler(
new LogHandler(
new BusinessHandler(null) // 末端无 next
)
)
);
也可用 builder 模式封装组装过程:
Handler<Request> chain = HandlerChain.builder()
.add(new AuthHandler(null))
.add(new RateLimitHandler(null))
.add(new LogHandler(null))
.build();
避免常见陷阱
- 循环引用:检查链中是否出现重复 handler(尤其动态注册场景)
- 漏传 next:末端 handler 的 next 为 null 是正常设计,但中间节点必须正确传入
- 异常未处理:若某 handler 抛异常,默认中断链;如需继续,需 try-catch 并显式调用 next
- 状态污染:handler 实例最好无状态,或确保线程安全(例如使用 ThreadLocal 存临时上下文)


















