Java中用函数式接口实现策略模式的核心是将策略抽象为单抽象方法接口,通过Lambda或方法引用动态传入行为,省去传统多类模板代码,支持运行时切换与组合。

Java 中用函数式接口实现策略模式,核心是把策略抽象成函数式接口,再用 Lambda 或方法引用动态传入具体行为,省去传统策略模式中一堆策略类和上下文类的模板代码。
定义函数式接口作为策略契约
策略模式的关键是统一的行为契约。Java 8+ 的函数式接口(只有一个抽象方法)天然适合作为策略接口:
- 用 @FunctionalInterface 显式声明,增强可读性和编译检查
- 方法名建议语义清晰,比如
calculate、validate、format - 避免过度复用内置接口(如
Function、BiPredicate),除非签名完全匹配且语义一致
例如定义一个折扣计算策略:
@FunctionalInterface
public interface DiscountStrategy {
double apply(double originalPrice, int quantity);
}用 Lambda 或方法引用传入具体策略
不再需要为每种折扣写一个实现类,直接在调用处内联定义逻辑:
立即学习“Java免费学习笔记(深入)”;
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 固定 9 折:
(price, qty) -> price * 0.9 - 满 100 减 10:
(price, qty) -> price * qty >= 100 ? price * qty - 10 : price * qty - 会员专属:假设已有静态方法
MemberDiscount::vipDiscount,可直接传MemberDiscount::vipDiscount
上下文类持有并执行策略
上下文只需持有一个函数式接口类型的字段,构造时注入,运行时调用:
public class OrderProcessor {
private final DiscountStrategy discountStrategy;
<pre class="brush:php;toolbar:false;">public OrderProcessor(DiscountStrategy strategy) {
this.discountStrategy = strategy;
}
public double calculateFinalAmount(double price, int quantity) {
return discountStrategy.apply(price, quantity);
}}
使用时非常轻量:
OrderProcessor processor = new OrderProcessor((p, q) -> p * q * 0.85); // 85 折 double amount = processor.calculateFinalAmount(200.0, 2); // → 340.0
支持运行时切换与组合(进阶技巧)
策略可像普通对象一样传递、缓存、条件选择,甚至组合:
- 根据用户类型选策略:
user.isVip() ? vipStrategy : normalStrategy - 链式组合(需自行封装):
(p,q) -> secondStrategy.apply(firstStrategy.apply(p,q), 1) - 用 Map 管理命名策略:
Map<string discountstrategy> strategies = Map.of("OLD", ..., "NEW", ...)</string>
不复杂但容易忽略:函数式接口实现的策略模式,真正价值在于降低抽象成本——策略即行为,行为即代码,无需提前规划类结构。

















