策略模式

55 阅读2分钟

策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式可以让算法的变化独立于使用它们的客户端,从而实现了更好的松耦合性。

在 JavaScript 中,策略模式可以通过对象字面量或函数来实现。下面是一个使用对象字面量实现策略模式的示例:

const strategies = {
  add: (num1, num2) => num1 + num2,
  subtract: (num1, num2) => num1 - num2,
  multiply: (num1, num2) => num1 * num2,
  divide: (num1, num2) => num1 / num2
};

class Calculator {
  constructor(strategy) {
    this.strategy = strategy;
  }

  calculate(num1, num2) {
    return this.strategy(num1, num2);
  }

  setStrategy(strategy) {
    this.strategy = strategy;
  }
}

const calculator = new Calculator(strategies.add);
console.log(calculator.calculate(10, 5)); // Output: 15

calculator.setStrategy(strategies.multiply);
console.log(calculator.calculate(10, 5)); // Output: 50

在这个示例中,我们定义了一个 strategies 对象,它包含了四个算法:addsubtractmultiplydivide。我们还定义了一个 Calculator 类,它有一个 strategy 成员变量表示当前使用的算法,以及两个方法:calculatesetStrategycalculate 方法接受两个数字参数,并根据当前的算法计算它们的结果。setStrategy 方法接受一个算法参数,并将当前算法设置为该参数。

最后,我们实例化了一个 Calculator 对象,并将 add 算法作为默认算法传递给它。我们先调用了 calculate 方法,传递了两个数字参数,并得到了相应的结果。接着,我们调用了 setStrategy 方法,将算法设置为 multiply,再次调用 calculate 方法,并得到了相应的结果。

总的来说,策略模式可以让我们更加灵活地设计和组织代码,让我们可以轻松地添加、删除和替换不同的算法。同时,策略模式也可以使代码更加可读和易于维护。

使用场景

  1. 表单验证:根据不同的验证规则,选择不同的验证策略。

  2. 排序算法:在排序过程中,可以根据不同的数据规模和类型选择不同的排序策略。

  3. 数据统计:在数据统计过程中,可以根据不同的统计规则,选择不同的统计策略。

  4. 购物车优惠:根据购物车中商品的不同种类和数量,选择不同的优惠策略。

在以上场景中,策略模式可以避免使用大量的if-else语句,提高代码的可读性和可维护性,同时也能方便地新增、删除和修改算法或策略。