以多态取代条件是什么
当同一组按类型分支的行为分散在多个条件语句里时,为类型建立类层次,把各分支下沉到对应实现。新增类型只需加一个实现类,不必再搜索所有分支;分支逻辑与类型定义绑在一起,漏改与改错的风险明显下降。
基本信息
| 适用场景 | 同一组条件在多处按类型分支 |
|---|---|
| 步骤 | 建立类层次,用工厂选择实现,分支下沉 |
| 前提 | 类型集合相对封闭,各分支行为差异显著 |
| 相邻手法 | 策略模式(可替换算法)、模式匹配(语言支持时) |
| 收益 | 新增类型不需要修改调用方 |
典型使用场景
- 计费规则按客户类型分支,计价与对账都要判断
- 按对象类型计算速度、容量等属性
- 通知渠道按类型走不同的发送逻辑
- 权限类型在过滤与展示中重复判断
- 语言支持模式匹配时,先评估是否比类层次更直白
方向示例
方向示例
class Bird {
double speed() { ... }
}
class EuropeanSwallow extends Bird { ... }
class AfricanSwallow extends Bird { ... }
// 调用方不再判断类型
return bird.speed();多态还是策略
| 维度 | 类层次(多态) | 策略对象 |
|---|---|---|
| 变化维度 | 类型本身有稳定的行为差异 | 同一算法需要运行期替换 |
| 组合方式 | 继承表达是一种的关系 | 组合表达有依赖的关系 |
| 选择时机 | 类型在建模阶段已经确定 | 运行期按配置或环境切换 |
语言支持时先用模式匹配评估:Java 的模式匹配分支、Rust 的枚举配合匹配往往比类层次更直白,尤其当类型集合封闭、行为不复杂时。
多态化后原条件的求值顺序可能丢失:原来靠条件先后顺序实现的短路效果,需要在拆分时显式保持,否则行为会变。
迁移步骤
- 先把每个分支的具体实现搬进独立方法,调用方仍走原条件
- 建立类型层次,用工厂按类型创建实现
- 逐个调用点替换为多态调用,未切换前保留旧条件
- 全部切换后删除条件与空壳方法,跑全量测试