Java策略模式通过多态解耦“做什么”与“怎么做”:定义统一接口(如PaymentStrategy),各实现类封装逻辑并自行判断适用性(canHandle),Spring自动注册所有策略,主流程遍历匹配执行;支持泛型、Lambda简化扩展,共用逻辑抽为工具类。

Java 通过多态实现策略模式,本质是把“该做什么”和“具体怎么做”彻底分开:接口定义统一行为契约,多个实现类各自封装逻辑,运行时由 JVM 自动绑定——调用方只管调用,完全不关心类型细节。
定义稳定、抽象的策略接口
接口只声明行为,不暴露业务判断依据或具体参数。例如支付场景,不要写 handle(String channel, BigDecimal amount),而应统一入参为上下文对象:
- 定义 PaymentStrategy 接口,仅含 boolean canHandle(PaymentContext context) 和 void execute(PaymentContext context)
- 所有实现类(WechatPayStrategy、AlipayStrategy)都实现这两个方法
- 方法签名必须严格一致:参数类型、数量、返回值不可变,否则多态无法成立
让策略自己决定是否适用
把识别逻辑下沉到策略内部,避免外部用 if-else 或 switch 判断该选谁:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- WechatPayStrategy.canHandle() 检查 context.getChannel().equals("wechat")
- AlipayStrategy.canHandle() 检查 context.isSupportAlipay() && context.getAmount().compareTo(BigDecimal.ONE_HUNDRED) >= 0
- 主流程只需遍历所有策略,取第一个 canHandle() == true 的实例,再调用 execute()
利用 Spring 自动注册与动态路由
别手动维护 Map 或硬编码 new 实例,靠容器能力确保不漏注册、不耦合:
立即学习“Java免费学习笔记(深入)”;
- 所有策略类标注 @Service(不是 @Component),Spring 启动时自动识别
- 通过 applicationContext.getBeansOfType(PaymentStrategy.class) 获取全部实例
- 缓存为 List<PaymentStrategy>,每次请求按 canHandle() 匹配,新增策略无需改主流程
- 高频路径可加 @Order 或用 ConcurrentHashMap 预注册,避免重复流式查找
支持泛型与轻量扩展
当输入输出类型多样或逻辑简单时,进一步提升复用性与开发效率:
- 策略接口可定义为 interface Strategy<T, R> { R apply(T input); boolean supports(T input); }
- 对简单规则(如固定折扣率),直接用 Lambda 替代实现类:Strategy<Double, Double> vipDiscount = x -> x * 0.85;
- Lambda 编译后仍是接口实现,底层仍靠多态分派,只是省去类文件
- 共用逻辑(日志、幂等校验)抽成工具类,每个策略保持方法体 ≤20 行

















