多态与行为参数化在策略模式中天然契合——多态提供运行时动态绑定能力,行为参数化将“做什么”变为可传入的逻辑单元,二者结合实现算法解耦与行为灵活替换。

Java 中多态与行为参数化在策略模式中天然契合——多态提供运行时动态绑定能力,行为参数化则把“做什么”变成可传入的逻辑单元。二者结合,让策略模式既能解耦算法实现,又能灵活替换行为,而不用改调用方代码。
多态是策略模式落地的底层支撑
策略接口定义统一方法签名,不同实现类各自重写;上下文持有接口类型引用,调用时实际执行哪个版本,由 JVM 在运行时根据对象实际类型决定。这正是多态的核心体现。
比如支付策略:
interface PaymentStrategy { void pay(Order order); }
class WechatPay implements PaymentStrategy { public void pay(Order o) { /* 微信逻辑 */ } }
class AlipayPay implements PaymentStrategy { public void pay(Order o) { /* 支付宝逻辑 */ } }
上下文 PaymentProcessor 持有 PaymentStrategy 引用,调用 strategy.pay(order) 时,无需 if-else,JVM 自动分派到对应实现。
行为参数化让策略更轻量、更即用
Java 8+ 的 Lambda 和函数式接口,把“行为”本身当作参数传递,绕过定义多个实现类的样板代码。它本质仍是多态——Lambda 编译后生成实现了函数式接口的匿名类,仍通过接口多态调用。
例如筛选苹果:
@FunctionalInterface
interface ApplePredicate { boolean test(Apple a); }
List<apple> filter(List<apple> list, ApplePredicate p) {
return list.stream().filter(p::test).collect(Collectors.toList());
}
// 行为直接传入,无需新建类
filter(inventory, a -> "red".equals(a.getColor()) && a.getWeight() > 150);</apple></apple>
这里 p::test 调用仍走 ApplePredicate.test() 接口方法,背后是多态分派,只是实现由编译器自动生成。
两者协同的关键设计点
- 策略接口必须是抽象的、稳定的契约,所有实现或 Lambda 都要遵守同一签名
- 上下文只依赖接口,不感知具体实现类名或 Lambda 写法,保持松耦合
- 新增策略只需新增实现类或传新 Lambda,不修改已有调用逻辑,符合开闭原则
- Spring 环境中常配合
@Autowired List<strategy></strategy>自动注入全部实现,再按条件选取,此时多态 + 容器管理进一步简化策略选择逻辑
本质上,行为参数化是多态的一种高阶表达:它把“策略实例”从显式类构造,压缩为一行表达式,但底层仍靠多态机制完成动态绑定。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











