多态与策略模式结合可彻底消除条件分支:用多态实现行为分发,策略模式封装算法,调用方只需discountStrategy.calculate(amount),新增规则仅需添加策略实现类和枚举项,无需修改原有判断逻辑。

多态和策略模式配合使用,能从根本上解决复杂条件分支带来的可维护性差、扩展困难、测试爆炸等问题。核心思路是:用多态做“行为分发”,用策略模式做“算法封装”,两者结合后,判断逻辑彻底消失,新增规则不再动老代码。
把类型判断交给运行时,而不是 if-else
传统写法中,调用方要主动判断对象类型再决定行为,比如:
- if (type.equals("VIP")) { ... }
- else if (type.equals("GOLD")) { ... }
- else if (type.equals("COUPON")) { ... }
这种结构让每次加一种新规则都得改这个判断块。换成多态后,调用变成一行:
- discountStrategy.calculate(amount);
具体执行哪个逻辑,由传入的策略对象在运行时决定——JVM 自动完成方法绑定,不用人写判断。
策略接口 + 多态实现类,职责清晰分离
定义统一入口,但每个规则各自独立实现:
- 定义 DiscountStrategy 接口,只声明
calculate(double amount) - 每种折扣规则(VIP、满减、限时券)各自写一个实现类,互不干扰
- 所有实现类天然具备多态能力:向上转型为接口,向下可被 Spring 容器管理或枚举驱动
这样,计算逻辑和选择逻辑完全解耦。谁负责选策略?可以是工厂、枚举、配置中心,甚至前端传来的类型字段——只要它返回一个 Strategy 实例,后续调用就自动走多态流程。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
用枚举+构造函数注入策略,避免硬编码分支
常见错误是把策略选择又写成 switch 或 if:
- switch (type) { case "VIP": return new VipStrategy(); ... }
更优做法是定义枚举,每个枚举项直接持有一个策略实例:
- enum DiscountType { VIP(new VipDiscountStrategy()), GOLD(new GoldDiscountStrategy()); private final DiscountStrategy strategy; ... }
- 调用时只需
DiscountType.valueOf(type).getStrategy().calculate(amount)
新增类型只需加一个枚举项和对应策略类,零修改已有代码,也不需要更新任何分支语句。
Spring 容器自动装配策略,支持运行时动态切换
在真实项目中,策略往往需要依赖其他 Bean(如远程调用、数据库查询)。这时可让每个策略类成为 Spring Bean:
- 用
@Service("vipDiscountStrategy")标注具体策略 - 上下文类通过
@Autowired @Qualifier("vipDiscountStrategy")获取指定策略 - 或使用
ObjectProvider按需获取,配合配置中心控制启用哪一种
这样不仅消除了分支,还天然支持 AOP 增强(如日志、熔断)、事务管理、异步调用等企业级能力。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










