Skip to content

策略设计模式 / Strategy

策略设计模式允许我们定义一系列算法,并将每一个策略方法封装到独立的策略对象中。这样客户端就可以根据具体需求动态地选择使用哪种策略,同时使得算法的改变不会影响到使用算法的客户端。

Code

javascript
// 策略接口 / 抽象策略类
class Strategy {
  calculate() {
    throw new Error('子类必须实现 calculate 方法');
  }
}

// 具体策略类
class ConcreteStrategyA extends Strategy {
  calculate() {
    return 10;
  }
}

// 具体策略类
class ConcreteStrategyB extends Strategy {
  calculate() {
    return 20;
  }
}

// 上下文类,持有可调整的策略对象,并且可以调用策略对象的方法
class Context {
  constructor(strategy) {
    this.strategy = strategy;
  }

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

  executeStrategy() {
    return this.strategy.calculate();
  }
}

对比表格驱动法

表格驱动法和策略模式都是用来组织和管理不同行为或算法的方式。

TIP

表格驱动法是一种编程技巧,通过预先构建的数据结构,通常是数组或者 Map 对象,在运行时根据条件从表格查找并执行相应的操作。简化代码并提高可维护性和扩展性。

区别

  • 封装程度:表格驱动法通常将行为直接编码为表格或映射项,而策略模式则更进一步,将每种行为封装成完整的类,增强了复用性和抽象性。
  • 复杂性和灵活性:表格驱动法更适合处理相对简单且规则明确的行为选择,策略模式更适合处理较为复杂的行为逻辑,因为策略类可以包含更多的状态和方法。
  • 设计意图:表格驱动法主要用于简化和集中化处理基于参数的决策过程;而策略模式更多是为了应对变化的需求,允许程序在多个可互换的行为之间灵活切换,同时也便于单元测试和复用。