策略模式简介及Java实现
策略模式(Strategy Pattern)属于行为型设计模式,它定义了一系列算法,并将每个算法封装在独立的类中,使得算法可以互相替换。这种模式让算法的变化独立于使用算法的客户端。
策略模式在实际应用中,可以用于将复杂的业务逻辑拆解成不同的策略,每个策略都是一个独立的类,可以独立变化和扩展。通过组合不同的策略,可以实现对同一问题的不同解决方案。
实现策略模式的核心构件
策略模式包含以下核心构件:
- 抽象策略(Strategy):定义了一个公共接口,所有具体策略都要实现这个接口。
- 具体策略(ConcreteStrategy):实现了抽象策略定义的接口,提供了具体的算法实现。
- 环境(Context):持有一个策略对象的引用,将具体策略的选择和使用委托给环境类。
策略模式的示例
下面通过一个简单的示例来演示策略模式的应用。假设有一个电商平台,需要根据不同的优惠策略计算商品的最终价格。
首先,我们定义一个抽象策略接口DiscountStrategy
,它包含一个计算折扣后价格的方法calculatePrice
:
public interface DiscountStrategy {
double calculatePrice(double originalPrice);
}
然后,我们编写两个具体的策略类VIPDiscountStrategy
和NormalDiscountStrategy
来实现折扣策略:
public class VIPDiscountStrategy implements DiscountStrategy {
public double calculatePrice(double originalPrice) {
return originalPrice * 0.8;
}
}
public class NormalDiscountStrategy implements DiscountStrategy {
public double calculatePrice(double originalPrice) {
return originalPrice * 0.9;
}
}
接下来,我们编写一个环境类PriceCalculator
,它持有一个策略对象的引用,并提供了一个方法calculate
来计算最终价格:
public class PriceCalculator {
private DiscountStrategy discountStrategy;
public PriceCalculator(DiscountStrategy discountStrategy) {
this.discountStrategy = discountStrategy;
}
public double calculate(double originalPrice) {
return discountStrategy.calculatePrice(originalPrice);
}
}
最后,我们可以在客户端中使用策略模式来计算价格。例如,我们创建一个VIP用户的价格计算器:
DiscountStrategy vipDiscount = new VIPDiscountStrategy();
PriceCalculator calculator = new PriceCalculator(vipDiscount);
double originalPrice = 100.0;
double finalPrice = calculator.calculate(originalPrice);
System.out.println("VIP用户购买价格:" + finalPrice);
输出结果为:VIP用户购买价格:80.0
同样地,我们可以创建一个普通用户的价格计算器来计算相同商品的价格:
DiscountStrategy normalDiscount = new NormalDiscountStrategy();
PriceCalculator calculator = new PriceCalculator(normalDiscount);
double originalPrice = 100.0;
double finalPrice = calculator.calculate(originalPrice);
System.out.println("普通用户购买价格:" + finalPrice);
输出结果为:普通用户购买价格:90.0
通过使用策略模式,我们可以很方便地切换不同的策略,而不需要修改客户端的代码。同时,新增加一个策略也很简单,只需要实现抽象策略接口即可。
总结
策略模式是一种简单而灵活的设计模式,适用于需要多种算法互相替换的场景。它通过将算法封装在独立的类中,使得算法的变化独立于使用算法的客户端。在Java中,我们可以使用接口和具体类来实现策略模式。