Skip to content

策略模式

策略模式定义

策略模式的定义是:定义一些列的算法,把它们一个个封装起来,并且可以使它们可以相互替换

使用策略模式计算奖金

比如年终分发给员工的奖金根据评价等级来定:S 级可以得到 4 倍奖金,A 级可以拿 3 倍奖金,B 级可以拿 2 倍奖金

那么我们定义一个基本的函数来计算

js
function computed(grade, bonus) {
  if (grade === 'S') {
    return bonus * 4
  }
  if (grade === 'A') {
    return bonus * 3
  }
  if (grade === 'B') {
    return bonus * 2
  }
}

console.log(computed('S', 3000)) // 12000
console.log(computed('A', 2000)) // 6000

但是这个函数看起来比较挫,内部包含了很多的 if else 语句,而且如果后期新增了一个其它的等级,还需要修改原函数,这个对于编写代码来说是非常不友好的

使用策略模式封装

接下来将上面的例子使用策略模式进行封装,会议一下策略模式的定义:

定义一些列的算法,把它们一个个封装起来,并且可以使它们可以相互替换

js
class GradeS {
  computed(bonus) {
    return bonus * 4
  }
}

class GradeA {
  computed(bonus) {
    return bonus * 3
  }
}

class GradeB {
  computed(bonus) {
    return bonus * 2
  }
}

class ComputedBonus {
  constructor(salary, strategy) {
    this.salary = salary
    this.strategy = strategy
  }
  getBonus() {
    return this.strategy.computed(this.salary)
  }
}

const computedBonus1 = new ComputedBonus(3000, new GradeS())
const computedBonus2 = new ComputedBonus(2000, new GradeA())

console.log(computedBonus1.getBonus()) // 12000
console.log(computedBonus2.getBonus()) // 6000