行为型模式-2.策略模式(Strategy Pattern)

 2024-07-29    0 条评论    57 浏览

设计模式

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,将每一个算法封装起来,并使它们可以互换。策略模式让算法独立于使用它的客户而独立变化。

策略模式的组成部分

  1. 策略接口(Strategy):定义了一系列算法的公共接口。
  2. 具体策略类(ConcreteStrategy):实现了策略接口的具体算法。
  3. 上下文类(Context):持有一个策略对象的引用,能够调用策略接口的方法。

策略模式的优点

  • 算法独立:算法的改变不会影响到使用算法的客户。
  • 代码复用:可以共享算法的实现。
  • 易于扩展:可以通过添加新的策略类来扩展新的行为,而不需要修改现有代码。

策略模式的缺点

  • 客户端必须知道所有的策略:客户端需要了解不同策略的具体实现。
  • 增加类的数量:每个策略都会导致一个新类的生成,可能导致类的数量增加。

Java 示例

下面是一个简单的示例,展示如何在 Java 中实现策略模式。假设我们有一个支付系统,可以选择不同的支付方式(如信用卡支付、支付宝支付和微信支付)。

1. 策略接口

public interface PaymentStrategy {
    void pay(int amount);
}

2. 具体策略类

public class CreditCardPayment implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        System.out.println("Paid " + amount + " using Credit Card.");
    }
}

public class AlipayPayment implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        System.out.println("Paid " + amount + " using Alipay.");
    }
}

public class WeChatPayment implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        System.out.println("Paid " + amount + " using WeChat.");
    }
}

3. 上下文类

public class ShoppingCart {
    private PaymentStrategy paymentStrategy;

    public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    public void checkout(int amount) {
        if (paymentStrategy == null) {
            throw new IllegalStateException("Payment strategy not set.");
        }
        paymentStrategy.pay(amount);
    }
}

4. 客户端代码

public class Main {
    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();

        // 设置支付方式为信用卡支付
        cart.setPaymentStrategy(new CreditCardPayment());
        cart.checkout(100);

        // 设置支付方式为支付宝支付
        cart.setPaymentStrategy(new AlipayPayment());
        cart.checkout(200);

        // 设置支付方式为微信支付
        cart.setPaymentStrategy(new WeChatPayment());
        cart.checkout(300);
    }
}

总结

在这个例子中,PaymentStrategy 是策略接口,而 CreditCardPaymentAlipayPaymentWeChatPayment 是具体的策略实现。ShoppingCart 是上下文类,用于设置具体的支付策略并进行支付操作。通过使用策略模式,可以方便地在运行时切换不同的支付方式,而无需修改 ShoppingCart 的代码。