Java可用函数式接口+Lambda替代传统策略模式,减少类文件;自定义DiscountStrategy接口明确语义;策略实例用Lambda或方法引用动态创建;上下文OrderService运行时注入策略;用Map管理策略实现开闭原则。

Java 中可以用函数式接口配合 Lambda 表达式或方法引用,替代传统策略模式中大量实现类的写法,从而显著减少类文件数量。核心思路是:把“策略”从类抽象为函数(Function、Consumer、Predicate 等),用接口定义行为契约,用 Lambda 封装具体逻辑。
用自定义函数式接口定义策略契约
避免直接依赖 JDK 内置接口导致语义模糊,可定义清晰命名的函数式接口,增强可读性与业务表达力:
@FunctionalInterface
public interface DiscountStrategy {
double apply(double originalPrice);
}这样比直接用 Function<double double></double> 更易理解,且便于后续扩展(如加日志、校验)。
策略实例用 Lambda 或方法引用动态创建
不再为每种折扣写一个 MemberDiscountStrategy、VipDiscountStrategy 类,而是按需构造:
-
会员打九折:
DiscountStrategy member = price -> price * 0.9; -
VIP 打七折:
DiscountStrategy vip = price -> price * 0.7; -
满 100 减 20(需封装逻辑):
DiscountStrategy fullReduction = price -> price >= 100 ? price - 20 : price; -
复用已有方法:
DiscountStrategy holiday = this::applyHolidayPromotion;(假设已存在该方法)
上下文类持有一个策略函数,运行时注入
上下文不再依赖具体策略类,只依赖函数式接口,支持灵活切换:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
public class OrderService {
private DiscountStrategy strategy;
<pre class="brush:php;toolbar:false;">public void setDiscountStrategy(DiscountStrategy strategy) {
this.strategy = strategy;
}
public double calculateFinalPrice(double original) {
return strategy.apply(original);
}}
使用时可随时更换策略,无需修改上下文代码:
orderService.setDiscountStrategy(vip);orderService.setDiscountStrategy(fullReduction);
进阶:用 Map 管理策略,替代 if-else 或工厂类
将不同策略按类型键入 Map,彻底消除条件分支和策略工厂类:
Map<string discountstrategy> strategies = Map.of(
"MEMBER", price -> price * 0.9,
"VIP", price -> price * 0.7,
"SEASONAL", price -> price * 0.85
);
<p>// 使用
String type = "VIP";
double finalPrice = strategies.getOrDefault(type, p -> p).apply(100.0);</p></string>新增策略只需往 Map 里加一项,不新增类、不改原有逻辑,真正实现开闭原则。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










