Java 中怎么通过接口实现策略模式
在 java 中,通过接口实现策略模式的核心做法是定义一个包含单一方法的接口作为策略契约,创建多个类分别实现该接口以封装不同的算法逻辑,并在上下文(context)中持有该接口的引用。调用时,只需将具体的策略实现类注入到上下文中,即可在不修改上下文代码的情况下切换行为。

如何设计并编写策略接口与具体实现类
设计策略模式的第一步是创建一个函数式接口,通常命名为 Strategy 或类似名称,其中定义一个抽象方法用于执行核心逻辑。接着,编写多个实现类,每个类对应一种具体的算法或行为。这些实现类必须严格遵循接口定义的方法签名。

public interface DiscountStrategy {
double calculateDiscount(double price);
}
public class NoDiscount implements DiscountStrategy {
@Override
public double calculateDiscount(double price) {
return price;
}
}
public class PercentageDiscount implements DiscountStrategy {
private final double percentage;
public PercentageDiscount(double percentage) {
this.percentage = percentage;
}
@Override
public double calculateDiscount(double price) {
return price * (1 - percentage);
}
}
如何在上下文中使用策略接口进行计算
上下文类负责维护对策略接口的引用,并提供一个方法供客户端调用。该方法内部直接委托给当前持有的策略对象执行计算。这种设计使得上下文类与具体的算法实现解耦,符合开闭原则。客户端可以在运行时动态更换策略对象。
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
立即学习“Java免费学习笔记(深入)”;

public class ShoppingCart {
private DiscountStrategy strategy;
public void setStrategy(DiscountStrategy strategy) {
this.strategy = strategy;
}
public double checkout(double price) {
if (strategy == null) {
return price; // 默认无折扣
}
return strategy.calculateDiscount(price);
}
}
// 使用示例
ShoppingCart cart = new ShoppingCart();
cart.setStrategy(new NoDiscount());
double result1 = cart.checkout(100.0); // 100.0
cart.setStrategy(new PercentageDiscount(0.1));
double result2 = cart.checkout(100.0); // 90.0
当策略接口未设置时会发生什么
如果在上下文中没有设置任何策略实现,即策略引用为 null,则上下文类需要处理这种情况以避免空指针异常。在上述代码中,checkout 方法检查了策略是否为空,如果为空则直接返回原价,这提供了一种默认的降级行为。

















