多态通过统一接口和各自实现将类型判断下放到子类,避免业务代码中冗余的if/switch;配合工厂模式创建实例,支持开闭原则;但仅适用于有明确类型分支且逻辑差异较大的场景。

多态本身不直接“处理”分支,而是把原本散落在业务代码里的类型判断,转移到对象自身行为中——让每个子类自己决定怎么做,而不是由外部用 if 或 switch 来指挥。
核心是统一接口 + 各自实现
先识别出那些反复出现的、按类型做不同事的逻辑,比如:
- 订单类型决定折扣计算方式(NORMAL/VIP/PROMOTION)
- 支付方式决定调用哪套 SDK(Alipay/WeChatPay/CardPay)
- 文件格式决定导出逻辑(PDF/Excel/CSV)
把这些共性操作抽象成一个接口或抽象类,例如:
interface DiscountCalculator { double calculate(double amount, Order order); }每个子类只管实现自己的逻辑:
- NormalDiscountCalculator 返回 amount * 0.9
- VipDiscountCalculator 返回 amount * 0.7
- PromotionDiscountCalculator 返回 amount * 0.5 + 20
业务代码里就只剩一行:calculator.calculate(amount, order),不再有类型判断。
靠工厂或注册表集中管理创建逻辑
谁来决定该用哪个子类?不要在业务方法里 new,而是交给工厂:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用字符串、枚举或配置项驱动,比如 factory.create("vip")
- 内部可用 Map 静态注册:calculators.put("VIP", new VipDiscountCalculator())
- Spring 环境下可结合 @Qualifier 或条件注入自动选择
新增一种折扣类型,只需加一个实现类 + 注册一行,所有调用点完全不动。
避免强行多态的边界情况
不是所有 if-else 都适合替换:
- 如果只是参数不同(比如税率从 0.05 变成 0.08),更适合用配置或构造函数传参
- 如果逻辑极简(如只返回固定字符串),拆成多个类反而增加理解成本
- 若分支依据是运行时动态值(如用户输入的任意数字),也不属于多态适用场景
多态真正有价值的地方,在于封装状态、隐藏复杂流程,并为未来行为大幅演进留出空间。
配合模板方法固化主干流程
当多个子类逻辑结构相似(比如都需校验→执行→记录→通知),可在抽象父类中定义模板方法:
- 把共性步骤(日志、事务、重试)写在模板里
- 把变化点(具体校验规则、执行动作)声明为 abstract 方法
- 子类只补实现,不重复写流程框架
这样既保持流程统一,又支持个性扩展,也更符合开闭原则。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










