策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式通常用来实现一组相关的行为或策略,让客户端可以在运行时选择其中的一个来执行。
下面是一个简单的Java代码示例,演示了如何使用策略模式来实现不同的折扣计算方法:
定义策略接口
首先,我们需要定义一个策略接口,该接口声明了一个所有具体策略类必须实现的方法。在这个例子中,我们将定义一个`DiscountStrategy`接口,用于表示折扣计算的策略。
```java
public interface DiscountStrategy {
double applyDiscount(double originalPrice);
}
```
实现具体的策略
接下来,我们为每种折扣策略创建具体的实现类。例如,我们可以有一个固定折扣和一个百分比折扣的实现。
```java
// 固定金额折扣策略
public class FixedDiscountStrategy implements DiscountStrategy {
private final double discountAmount;
public FixedDiscountStrategy(double discountAmount) {
this.discountAmount = discountAmount;
}
@Override
public double applyDiscount(double originalPrice) {
return Math.max(originalPrice - discountAmount, 0); // 确保价格不低于0
}
}
// 百分比折扣策略
public class PercentageDiscountStrategy implements DiscountStrategy {
private final double percentage;
public PercentageDiscountStrategy(double percentage) {
this.percentage = percentage;
}
@Override
public double applyDiscount(double originalPrice) {
return originalPrice * (1 - percentage / 100);
}
}
```
创建上下文类
然后,我们需要创建一个上下文类,这个类持有一个对策略对象的引用,并提供一个方法来设置当前使用的策略。此外,它还提供了一个方法来应用选定的策略。
```java
public class ShoppingCart {
private DiscountStrategy discountStrategy;
public void setDiscountStrategy(DiscountStrategy discountStrategy) {
this.discountStrategy = discountStrategy;
}
public double calculateTotal(double originalPrice) {
if (discountStrategy == null) {
return originalPrice; // 如果没有设置策略,则不打折
}
return discountStrategy.applyDiscount(originalPrice);
}
}
```
使用策略模式
最后,我们可以通过以下方式来使用这些策略:
```java
public class Main {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
// 假设商品原价是100元
double originalPrice = 100.0;
// 应用固定折扣策略
cart.setDiscountStrategy(new FixedDiscountStrategy(20.0)); // 减去20元
System.out.println("Fixed discount price: " + cart.calculateTotal(originalPrice));
// 应用百分比折扣策略
cart.setDiscountStrategy(new PercentageDiscountStrategy(10)); // 打9折
System.out.println("Percentage discount price: " + cart.calculateTotal(originalPrice));
}
}
```
以上代码展示了如何在Java中实现策略模式。通过这种方式,你可以很容易地添加新的折扣计算方法,而不需要修改现有的代码,从而遵循了开闭原则(对扩展开放,对修改关闭)。