Java中可用Lambda表达式简洁实现策略模式:定义@FunctionalInterface作为策略契约,用Lambda直接传入具体行为,如fixed->price-50;通过方法参数动态切换策略,或用Map管理命名策略,提升灵活性与可维护性。

Java 中可以用 Lambda 表达式简洁地实现策略模式,核心是把“算法”抽象为函数式接口的实例,用 Lambda 直接传入具体行为,避免冗长的策略类定义。
定义函数式接口作为策略契约
策略模式的关键是统一的行为契约。在 Java 8+ 中,直接定义一个 @FunctionalInterface 就够了,无需抽象类或多个实现类:
@FunctionalInterface
public interface DiscountStrategy {
double applyDiscount(double originalPrice);
}这个接口只有一个抽象方法,天然支持 Lambda 赋值。
用 Lambda 替代传统策略类
原来需要写多个类(如 FixedDiscountStrategy、PercentageDiscountStrategy),现在一行 Lambda 即可:
立即学习“Java免费学习笔记(深入)”;
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
固定减额策略:
DiscountStrategy fixed = price -> Math.max(0, price - 50); -
九折策略:
DiscountStrategy nineOff = price -> price * 0.9; -
满 200 减 30:
DiscountStrategy threshold = price -> price >= 200 ? price - 30 : price;
在上下文中动态切换策略
把策略作为参数注入业务逻辑,比如一个订单服务:
public class OrderService {
public double calculateFinalPrice(double price, DiscountStrategy strategy) {
return strategy.applyDiscount(price);
}
}
<p>// 使用时灵活传入不同 Lambda
OrderService service = new OrderService();
System.out.println(service.calculateFinalPrice(100, price -> price * 0.85)); // 八五折
System.out.println(service.calculateFinalPrice(250, price -> price >= 200 ? price - 40 : price)); // 满减不需要修改类结构,也不用维护一堆策略类,扩展新策略只需新增一行 Lambda。
进阶:用 Map 管理命名策略
若需按名称查找策略(如配置驱动),可用 Map<String, DiscountStrategy> 预存常用 Lambda:
Map<String, DiscountStrategy> strategies = new HashMap<>() {{
put("VIP", price -> price * 0.7);
put("COUPON_10", price -> price - 10);
put("FESTIVAL", price -> price < 100 ? price : price * 0.8);
}};调用时:strategies.get("VIP").applyDiscount(200) —— 简洁又易维护。

















