多态是策略模式落地的必要基础,策略接口必须用interface以支持任意类动态实现,避免abstract class强制继承破坏继承链;spring通过@autowired注入策略集合,运行时用map按名称查找并校验key存在性,上下文与策略彻底解耦。

多态是策略模式能落地的关键支撑,不是锦上添花,而是必要基础。没有多态,策略就退化成一堆 if-else 或硬编码分支,失去可扩展性和可测试性。
策略接口必须用 interface
策略的核心是运行时动态替换,要求任意类(哪怕已有父类)都能实现它。interface 允许类在不破坏继承链的前提下接入策略;abstract class 强制继承,会卡住已有继承结构的类——比如订单服务已继承 Service,就无法再继承 StrategyBase。
- 接口方法不要加 default 实现,避免悄悄塞进共享逻辑,违背策略隔离原则
- 真有公共行为,抽成工具类,或通过构造参数传入,别污染策略契约
Spring 中自动装配策略集合
靠 @Autowired 注入 List
- 想按名称区分?在实现类上加 @Qualifier("alipay"),Map 的 key 就是这个值
- 别在策略类里直接 @Autowired 其他 service——它只是纯逻辑容器,依赖应由调用方传入或构造器注入
- 手动 new 实例或用 if-else 判断类型再 cast,既绕过 Spring 生命周期,又难测、难维护
运行时选策略,优先用 Map 查找
典型场景:前端传 "alipay" 或 "wechat" 字符串,决定走哪个支付策略。
- 初始化 Map 时用 new HashMap(strategies),别用 ImmutableMap——否则新增策略要重启应用
- 查找前先校验 key 是否存在:if (!strategyMap.containsKey(channel)) { throw new IllegalArgumentException("Unsupported channel: " + channel); }
- 避免用枚举做 key,前端传错字符串就进不了逻辑,问题难定位
上下文与策略解耦要彻底
Context 类只持有一个 Strategy 接口引用,不感知具体实现;调用方决定传哪个策略实例,甚至可在运行时切换。
- 新增策略?加个新类,实现接口,加 @Service 注解——原有代码一行不改
- 单元测试时,可直接 new 某个策略类或 mock 接口,无需启动容器
- 策略类里不暴露内部状态,不强耦合业务上下文,否则多态就成了“假抽象”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











