java泛型责任链模式通过泛型约束上下文与处理器类型一致性,定义泛型接口handlercontext抽象通用契约,抽象类chainhandler统一处理器签名并返回boolean控制链路,泛型chain确保添加处理器时类型安全,上下文实例全程复用,避免硬编码和强转。

Java中泛型责任链模式的ChainHandler处理通用上下文对象,核心在于让上下文类型可变、链路节点类型安全、执行逻辑不耦合具体业务。关键不是把所有东西塞进一个Object,而是用泛型约束上下文与处理器的一致性。
定义泛型上下文接口
先抽象出通用上下文的最小契约,比如支持状态流转、数据携带和中断控制:
- 定义接口
HandlerContext<t></t>,其中T是业务数据的实际类型(如OrderContext、UserContext) - 接口提供
getData()、setData(T data)、setCompleted(boolean)、isInterrupted()等基础方法 - 避免在接口里塞业务字段,只保留责任链共用行为;具体字段由实现类承载
泛型处理器统一签名
每个处理器不再面向具体上下文,而是面向HandlerContext<t></t>,并保持链式调用能力:
- 声明抽象处理器
abstract class ChainHandler<t> implements Function<handlercontext>, Boolean></handlercontext></t> -
handle(HandlerContext<t> context)</t>返回Boolean:true表示继续下一个,false表示中断 - 子类只需实现
doHandle(HandlerContext<t> context)</t>,内部专注业务逻辑,不操心链路调度 - 例如:
class FraudCheckHandler extends ChainHandler<paymentcontext></paymentcontext>,编译期就限定只能处理PaymentContext
构建类型安全的责任链
链本身也需泛型化,确保添加处理器时类型匹配:
- 定义
Chain<t></t>,内部维护List<chainhandler>></chainhandler> -
add(ChainHandler<t> handler)</t>方法天然拒绝传入ChainHandler<usercontext></usercontext>到Chain<ordercontext></ordercontext> - 执行入口
execute(HandlerContext<t> context)</t>遍历处理器,逐个调用handler.handle(context) - 上下文对象实例在启动链时传入一次,全程复用,避免重复构造或类型转换
运行时灵活适配不同业务场景
通用不等于僵化,可通过组合或委托支持差异逻辑:
- 若某环节需访问额外环境信息(如配置、用户权限),不往上下文中硬加字段,而是通过构造器注入依赖
- 对需要分支判断的场景,可在
HandlerContext中增加getStage()或getFlag(String key),由前置处理器设置,后续处理器读取决策 - 避免在处理器中强转上下文(如
(OrderContext) context.getData()),这会破坏泛型意义;类型已在编译期锁定
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











