1. 简单介绍
策略模式(Strategy Pattern)是一种行为型设计模式,它允许你在运行时根据不同的场景或需求选择对象的行为。策略模式主要用于将一系列相关的算法封装成一组可互换的对象,从而实现算法的解耦,避免使用多重条件选择语句。
策略模式包含以下三个主要组成部分:
- 策略接口(Strategy Interface):这是一个公共接口,定义了所有支持的策略或算法应该具备的方法。客户端将通过这个接口与各种策略进行交互。
- 具体策略(Concrete Strategies):这些类实现了策略接口,提供了不同的行为或算法。具体策略可以根据需要增加或减少,且它们彼此之间可以互换。
- 上下文(Context):上下文类负责维护一个对策略对象的引用,并在需要时将客户端的请求委托给当前策略对象。上下文类通常包含客户端需要使用的方法,并在内部调用策略接口的方法来实现这些功能。
2. 案例
以下是一个简单的例子。假设我们有一个电商网站,根据不同的客户类型,网站需要提供不同的折扣策略。我们可以通过策略模式来实现这个功能。
首先,我们定义一个折扣策略接口:
public interface DiscountStrategy {
double applyDiscount(double price);
}
接下来,我们创建几个具体的折扣策略实现类:
public class NoDiscountStrategy implements DiscountStrategy {
@Override
public double applyDiscount(double price) {
return price;
}
}
public class PercentageDiscountStrategy implements DiscountStrategy {
private double percentage;
public PercentageDiscountStrategy(double percentage) {
this.percentage = percentage;
}
@Override
public double applyDiscount(double price) {
return price * (1 - percentage / 100);
}
}
public class FixedAmountDiscountStrategy implements DiscountStrategy {
private double fixedAmount;
public FixedAmountDiscountStrategy(double fixedAmount) {
this.fixedAmount = fixedAmount;
}
@Override
public double applyDiscount(double price) {
return price - fixedAmount;
}
}
然后,我们创建一个上下文类,用于保存当前的折扣策略,并将客户端请求委托给该策略:
public class ShoppingCart {
private DiscountStrategy discountStrategy;
public ShoppingCart(DiscountStrategy discountStrategy) {
this.discountStrategy = discountStrategy;
}
public void setDiscountStrategy(DiscountStrategy discountStrategy) {
this.discountStrategy = discountStrategy;
}
public double applyDiscount(double price) {
return discountStrategy.applyDiscount(price);
}
}
最后,客户端可以根据需要在运行时选择和更改折扣策略:
public class Main {
public static void main(String[] args) {
double originalPrice = 100;
ShoppingCart cart = new ShoppingCart(new NoDiscountStrategy());
System.out.println("No discount: " + cart.applyDiscount(originalPrice));
cart.setDiscountStrategy(new PercentageDiscountStrategy(10));
System.out.println("10% discount: " + cart.applyDiscount(originalPrice));
cart.setDiscountStrategy(new FixedAmountDiscountStrategy(15));
System.out.println("Fixed amount discount (15): " + cart.applyDiscount(originalPrice));
}
}
这个例子展示了如何使用策略模式来实现不同类型的折扣策略,并在运行时动态更改折扣策略。通过将折扣策略封装为独立的类,我们可以轻松地添加更多的策略,而无需修改 ShoppingCart 类的实现。
3. 总结
策略模式不仅仅是替换 if-else 语句,它的主要目的是将一组可互换的算法或行为封装成对象,从而使它们在运行时可以根据需要灵活地更换。通过使用策略模式,你可以避免在代码中使用大量的条件判断语句,提高代码的可读性、可维护性和扩展性。
总结一下策略模式的主要特点:
- 策略模式将算法或行为封装成独立的策略类,使它们可以互换使用。
- 策略模式可以避免使用多重条件选择语句(如 if-else、switch),提高代码的可读性和可维护性。
- 策略模式允许在运行时动态选择和更改算法或行为。
- 策略模式有助于遵循开闭原则,即在不修改现有代码的情况下,通过添加新的策略来扩展功能。
- 策略模式适用于那些具有多种算法或行为,并且它们之间可以互换的场景。
因此,策略模式不仅仅是替换 if-else 语句,它更是一种实现算法或行为灵活切换的设计模式,有助于提高代码质量。