责任链模式中,抽象父类封装统一传递逻辑,子类仅需实现canhandle()和dohandle();通过setnext()构建链,head.handle()触发自动流转,避免重复传递代码。

责任链模式中,利用继承抽象类传递请求的核心在于:抽象父类定义统一的处理接口和默认的“向下传递”逻辑,子类只专注自己是否处理、如何处理,不必重复写传递代码。
抽象处理器统一管理传递逻辑
抽象类中声明一个类型为自身(Handler)的 next 字段,并提供 setNext() 方法;关键是在 handle() 方法里,先尝试本类处理,若不处理或处理完毕后仍需继续,则调用 next.handle() —— 这个“传递动作”由父类封装,所有子类自动继承,无需重写。
- 子类只需覆写 canHandle() 和 doHandle(),决定是否介入
- 调用链构建时,用 handler1.setNext(handler2).setNext(handler3) 即可串联
- 客户端只对链头调用 head.handle(request),后续流转完全透明
典型抽象类结构示例
以下是一个简洁可用的抽象基类:
abstract class Handler {
protected Handler next;
public Handler setNext(Handler next) {
this.next = next;
return next; // 支持链式调用
}
public final void handle(Request request) {
if (canHandle(request)) {
doHandle(request);
}
if (next != null) {
next.handle(request); // 统一传递,子类不操心
}
}
protected abstract boolean canHandle(Request request);
protected abstract void doHandle(Request request);
}
子类只需关注业务判断与执行
比如日志处理器链:
- ErrorLogger:只处理 error 级别,处理完不阻止传递(便于同时记录+告警)
- WarnLogger:处理 warn,也可选择调用 super.handle() 继续往下(但通常由父类 handle() 自动完成)
- InfoLogger:处理 info,不拦截也不中断,纯粹旁观式记录
所有子类都不需要写 if (next != null) next.handle(...),避免重复和遗漏。
注意继承带来的控制粒度
继承方式让传递行为强绑定在父类中,适合“固定流程、统一调度”的场景;但若某些环节需动态跳过、条件分支跳转、或支持环形链,则建议改用组合 + 显式委托,而非依赖继承链。继承简化了编码,也约束了灵活性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











