Skip to content

策略模式

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式使得算法可以在不影响客户端的情况下发生变化,从而提供了灵活性和可复用性。

策略模式的主要角色

  1. Strategy(策略接口):定义了所有支持的算法的公共接口。通过这个接口,Context 可以使用所有具体策略中的任意一个。
  2. ConcreteStrategy(具体策略类):实现了 Strategy 接口,提供具体的算法实现。
  3. Context(上下文):持有一个对 Strategy 对象的引用,并且与一个具体策略协作来定义当前采用的算法。

在 JavaScript 中的实现

下面是一个简单的例子来说明如何在 JavaScript 中使用策略模式:

示例:支付方式选择

假设你正在开发一个电子商务网站,需要根据用户的选择来决定使用哪种支付方式(如信用卡、PayPal 等)。

javascript
// Strategy(策略接口)
class PaymentStrategy {
  pay(amount) {
    throw new Error("This method should be overridden");
  }
}

// ConcreteStrategy(具体策略类)
class CreditCardPayment extends PaymentStrategy {
  constructor(name, cardNumber, cvv) {
    super();
    this.name = name;
    this.cardNumber = cardNumber;
    this.cvv = cvv;
  }

  pay(amount) {
    console.log(`Paid ${amount} using Credit Card.`);
  }
}

class PayPalPayment extends PaymentStrategy {
  constructor(email) {
    super();
    this.email = email;
  }

  pay(amount) {
    console.log(`Paid ${amount} using PayPal.`);
  }
}

// Context(上下文)
class ShoppingCart {
  constructor() {
    this.amount = 0;
    this.paymentStrategy = null;
  }

  setPaymentStrategy(paymentStrategy) {
    this.paymentStrategy = paymentStrategy;
  }

  checkout(amount) {
    if (!this.paymentStrategy) {
      throw new Error("No payment strategy set");
    }
    this.amount = amount;
    this.paymentStrategy.pay(this.amount);
  }

  addProduct(price) {
    this.amount += price;
  }
}

// 使用示例
const cart = new ShoppingCart();

cart.addProduct(50); // 假设添加了一些商品到购物车
cart.setPaymentStrategy(
  new CreditCardPayment("John Doe", "1234567890123456", "123")
);

cart.checkout(); // 输出: Paid 50 using Credit Card.

cart.setPaymentStrategy(new PayPalPayment("john.doe@example.com"));
cart.checkout(); // 输出: Paid 50 using PayPal.

代码解释

  • PaymentStrategy(策略接口):定义了一个 pay 方法,所有具体支付策略都必须实现这个方法。
  • CreditCardPayment 和 PayPalPayment(具体策略类):分别实现了 pay 方法,代表了不同的支付方式。
  • ShoppingCart(上下文):维护了一个对 PaymentStrategy 的引用,并允许动态设置支付策略。checkout 方法调用了当前设置的支付策略的 pay 方法来完成支付过程。

应用场景

策略模式适用于以下几种情况:

  • 当你需要定义一系列算法,并将每一个算法封装起来,使它们可以相互替换时。
  • 当算法的不同版本被用于不同输入数据时。
  • 当不希望在客户代码中暴露复杂的、与算法相关的数据结构时。

通过使用策略模式,可以使算法的变化独立于使用该算法的客户代码,提高了代码的灵活性和复用性。此外,它还支持在运行时切换算法,这对于需要根据不同条件执行不同操作的应用程序来说非常有用。

Released under the MIT License.