2、策略模式

26 阅读1分钟

核心:定义一系列算法,并将每个算法封装在具有共同接口的单独对象中,并可替换。

场景:处理一系统相同但有细微差别的逻辑

代码实现:根据绩效计算奖金

未使用策略模式:代码写死了

function getMoney(jixiao, baseMoney) {
  if(jixiao === 's') return baseMoney * 2
  else if(jixiao === 'a') return baseMoney * 1.5
  else if(jixiao === 'b') return baseMoney * 1
  else if(jixiao === 'c') return baseMoney * 0.8
  else if(jixiao === 'd') return baseMoney * 0.5
  else return baseMoney * 0
}

getMoney('s', 1000) // 2000
getMoney('a', 1000) // 1500
getMoney('c', 1000) // 800

使用了策略模式:策略可随时替换

// 奖金策略 1
const moneyStrategie1 = {
  s(baseMoney) {
    return baseMoney * 2
  },
  a(baseMoney) {
    return baseMoney * 1.5
  },
  b(baseMoney) {
    return baseMoney * 0.8
  },
  c(baseMoney) {
    return baseMoney * 0.5
  },
  d(baseMoney) {
    return baseMoney * 0
  }
}

// 奖金策略 2
const moneyStrategie2 = {
  s(baseMoney) {
    return baseMoney * 20
  },
  a(baseMoney) {
    return baseMoney * 15
  },
  b(baseMoney) {
    return baseMoney * 8
  },
  c(baseMoney) {
    return baseMoney * 5
  },
  d(baseMoney) {
    return baseMoney * 0
  }
}

function getMoney(strategy) {
  this.calcMoney = (jixiao, baseMoney) => {
    return strategy[jixiao](baseMoney)
  }
}

// 使用奖金策略 1
const getMoney1 = new getMoney(moneyStrategie1)

getMoney1('s', 1000) // 2000
getMoney1('a', 1000) // 1500
getMoney1('c', 1000) // 800

// 使用奖金策略 2
const getMoney2 = new getMoney(moneyStrategie2)

getMoney1('s', 1000) // 20000
getMoney1('a', 1000) // 15000
getMoney1('c', 1000) // 8000

总结:就是将零散的判断逻辑,封装在单独的对象中,并提供一个策略切换函数。