多态通过策略模式将分支判断从调用处移至策略工厂和实现类中,业务主流程仅保留接口调用;统一接口抽象语义动作,各实现类封装自身判断与执行逻辑;工厂动态路由并可缓存匹配结果;上下文对象传递必要数据;新增策略无需修改现有代码,支持独立测试与编译期类型安全。

多态本身不直接“消除”分支,而是把判断逻辑从调用处移走,集中到对象创建和策略选取环节。业务主流程里不再出现 if、else 或 switch,只保留一句干净的接口调用。
统一接口 + 差异化实现类
先识别所有分支处理的是同一语义动作:比如“计算折扣”“处理订单异常”“导出报表”。把这些动作抽象成一个接口,如 OrderFailureHandler 或 ExportStrategy,只声明方法签名,不暴露任何类型字段或判断条件。
- 每个具体场景对应一个实现类:如
TimeoutHandler、ValidationFailedHandler、PdfExportStrategy - 每个类内部封装自己的判断与执行逻辑,例如
canHandle(context)检查超时时间,execute(context)发送告警 - 调用方只面向接口编程:
handler.execute(context),完全不知道背后是哪个类
策略工厂负责动态路由
把“选哪个策略”的逻辑收口到一个工厂类中,避免散落在各处的手动 if 或 switch。
- Spring 环境下,所有策略类标注
@Service并实现标记接口(如OrderFailureStrategy) - 工厂启动时自动扫描全部实现:
applicationContext.getBeansOfType(OrderFailureStrategy.class) - 运行时遍历所有策略,调用
canHandle(context),找到第一个返回true的即执行execute(context) - 可加缓存:首次匹配后,将错误码等关键特征与策略绑定,后续直接查表,跳过遍历
上下文对象承载全部必要信息
策略之间不共享状态,也不互相调用。所有需要的数据都通过一个统一上下文对象传入,如 TradeContext 或 ExportContext。
立即学习“Java免费学习笔记(深入)”;
- 上下文包含订单号、错误码、金额、用户等级、时间戳等字段
- 策略按需读取,无需解析字符串或转换枚举——判断逻辑完全内聚在类内部
- 新增一种状态?只需加一个新策略类,实现
canHandle和execute,不改任何已有代码
测试与扩展更轻量
每个策略可独立单元测试,不用构造复杂条件覆盖所有分支路径。
- 测试
TimeoutHandler时,只注入一个含超时时间的context,验证其是否响应并执行正确动作 - 新增支付方式、导出格式、审批规则时,只需新增实现类 + 注册进工厂,业务代码零修改
- 若使用 Java 17+,可用
sealed interface明确限定所有策略类型,配合switch表达式获得编译期完整性检查


















