什么是策略模式?

1,084 阅读3分钟

1. 简单介绍

策略模式(Strategy Pattern)是一种行为型设计模式,它允许你在运行时根据不同的场景或需求选择对象的行为。策略模式主要用于将一系列相关的算法封装成一组可互换的对象,从而实现算法的解耦,避免使用多重条件选择语句。

策略模式包含以下三个主要组成部分:

  1. 策略接口(Strategy Interface):这是一个公共接口,定义了所有支持的策略或算法应该具备的方法。客户端将通过这个接口与各种策略进行交互。
  2. 具体策略(Concrete Strategies):这些类实现了策略接口,提供了不同的行为或算法。具体策略可以根据需要增加或减少,且它们彼此之间可以互换。
  3. 上下文(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 语句,它的主要目的是将一组可互换的算法或行为封装成对象,从而使它们在运行时可以根据需要灵活地更换。通过使用策略模式,你可以避免在代码中使用大量的条件判断语句,提高代码的可读性、可维护性和扩展性。

总结一下策略模式的主要特点:

  1. 策略模式将算法或行为封装成独立的策略类,使它们可以互换使用。
  2. 策略模式可以避免使用多重条件选择语句(如 if-else、switch),提高代码的可读性和可维护性。
  3. 策略模式允许在运行时动态选择和更改算法或行为。
  4. 策略模式有助于遵循开闭原则,即在不修改现有代码的情况下,通过添加新的策略来扩展功能。
  5. 策略模式适用于那些具有多种算法或行为,并且它们之间可以互换的场景。

因此,策略模式不仅仅是替换 if-else 语句,它更是一种实现算法或行为灵活切换的设计模式,有助于提高代码质量。