策略模式

策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。

概述

  • 解决问题:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护,缺乏弹性(扩展性差),复用性差
  • 何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为
  • 如何解决:将这些算法封装成一个一个的类,任意地替换
  • 核心代码:实现同一个接口
  • 应用实例
    • 诸葛亮的锦囊妙计,每一个锦囊就是一个策略
  • 优点
    • 算法可以自由切换
    • 避免使用多重条件判断
    • 扩展性良好
  • 缺点
    • 策略类会增多
    • 所有策略类都需要对外暴露
  • 使用场景
    • 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
    • 一个系统需要动态地在几种算法中选择一种。
    • 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

结构

策略模式包含如下角色:

  • Context(环境类):持有一个 Strategy 类的引用,用一个 ConcreteStrategy 对象来配置。
  • Strategy(抽象策略类):定义所有支持的算法的公共接口。通常是以一个接口或抽象来实现,Context 使用这个接口来调用其 ConcreteStrategy 定义的算法。
  • ConcreteStrategy(具体策略类):以 Strategy 接口实现某具体算法。

策略模式的使用,可以避免过多的 if-else 判断,也可以替代简单逻辑的 switch

const formatDemandItemType = value => {
  switch (value) {
    case 0:
      return '初级';
    case 1:
      return '中级';
    case 2:
      return '高级';
  }
};

const formateDemandItemType = value => {
  const enum = {
    0: '初级',
    1: '中级',
    2: '高级',
  };
};