多态替代if-else的核心是将条件分支逻辑下移到对象自身行为中:定义统一接口(如discountpolicy),各类型实现具体策略(如vipdiscount),运行时动态绑定调用,业务代码零条件判断、零修改,符合开闭原则。

核心思路是把“根据条件走不同逻辑”这件事,从外部判断转移到对象自身行为中——让每个类型自己决定怎么做,而不是由一堆 if-else 来指挥。
定义统一接口或抽象类
先识别所有 if-else 分支在做什么共性操作,比如“计算折扣”“生成报表”“处理支付”。把这些动作提取成一个接口方法或抽象方法。
- 例如原代码用 if-else 判断订单类型再算价格:
- if (type.equals("VIP")) { return amount * 0.7; }
- else if (type.equals("PROMOTION")) { return amount * 0.5 + 20; }
- 可改为定义接口:DiscountPolicy { double apply(double amount); }
- 每个策略对应一个实现类:VipDiscount、PromotionDiscount……各自封装自己的计算逻辑
运行时动态绑定,调用不关心具体类型
业务代码不再写条件判断,而是接收一个策略对象,直接调用它的方法。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 服务类里写:policy.apply(amount) —— 一行搞定,没有 if,也没有 else
- 类型信息已封装在 policy 实例中,JVM 自动调用对应子类的实现
- 调用方完全不需要知道当前是 VIP 还是促销,也不用修改逻辑去适配新类型
搭配工厂或配置,支持开闭原则
新增一种类型时,只需加一个新实现类,再在工厂或配置里注册映射关系,原有业务代码零改动。
- 工厂示例:用 Map 存映射,"VIP" → new VipDiscount()
- Spring 环境下可用 @Component + @Qualifier 或 @Primary 自动注入不同策略 bean
- 配置驱动时,还可从配置中心读取策略名,动态获取对应实例
适用前提和边界要注意
多态替代 if-else 不是万能银弹,只适合“同一操作、多种实现”的场景。
- 如果各分支做的事本质不同(比如有的发短信、有的写数据库、有的调第三方),硬套多态反而增加理解成本
- 若分支逻辑极简(如仅返回固定字符串),用 Map 查表或枚举更轻量
- 涉及状态流转或复杂上下文依赖时,可能更适合状态模式而非纯多态
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










