泛型策略模式的核心是让策略接口适配不同输入输出类型并保障类型安全,关键在于将类型变量精准落在输入T、输出R及可选异常E上,通过Strategy<T,R>定义、具体策略绑定业务类型、Context支持泛型切换及Spring中用@Qualifier或Map管理策略实例来实现。

泛型策略模式的核心,是让策略接口能适配不同输入和输出类型,同时保持算法逻辑的复用性与类型安全性。关键不在于“写得更复杂”,而在于把类型变量精准落在策略行为的输入、处理、输出三个环节上。
泛型策略接口定义要覆盖数据流
原始 Strategy<T> 只约束了输入,但实际业务中往往需要明确输入类型、输出类型,甚至异常类型。推荐这样定义:
-
输入参数:用
T表示待处理的数据(如订单、用户、配置) -
返回结果:用
R表示执行后产出(如响应体、状态码、DTO) -
异常类型可选:若策略可能抛出特定异常(如
ValidationException),可加E extends Throwable
示例接口:
public interface Strategy<T, R> {
R execute(T data);
}
具体策略实现需绑定真实业务类型
每个具体策略类应明确声明它处理什么、返回什么。比如一个风控策略:
立即学习“Java免费学习笔记(深入)”;
- 输入是
OrderRequest,输出是CheckResult - 实现时直接指定泛型参数,编译器自动校验类型安全
代码示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
public class RiskControlStrategy implements Strategy<OrderRequest, CheckResult> {
@Override
public CheckResult execute(OrderRequest request) {
// 实际风控逻辑
boolean passed = request.getAmount() < 10000;
return new CheckResult(passed, "风控检查完成");
}
}
上下文类(Context)要支持运行时策略切换
Context 不应绑定具体泛型,而是作为通用容器持有 Strategy<T, R> 引用,并提供类型一致的执行入口:
- 构造时传入任意
Strategy<T, R>实例 - 方法签名保留泛型,由调用方决定 T 和 R
- 避免在 Context 内做类型转换或 instanceof 判断
示例:
public class StrategyContext<T, R> {
private final Strategy<T, R> strategy;
public StrategyContext(Strategy<T, R> strategy) {
this.strategy = strategy;
}
public R execute(T data) {
return strategy.execute(data);
}
}
使用时自然推导类型:
StrategyContext<OrderRequest, CheckResult> context
= new StrategyContext<>(new RiskControlStrategy());
CheckResult result = context.execute(orderReq); // 编译期即确定类型
配合 Spring 使用时注意 Bean 泛型注入
Spring 默认不支持泛型 Bean 的自动装配(@Autowired Strategy<X, Y> 会失败),可行方案有:
- 用
@Qualifier配合命名区分策略(如@Qualifier("riskStrategy")) - 将策略注册为
Map<String, Strategy>,运行时按 key 获取 - 自定义
StrategyFactory<T,R>工厂类,封装查找与类型适配逻辑
不建议强行让 Spring 管理泛型接口的多实例,容易引发类型擦除导致的歧义。

















