js设计模式——策略模式

272 阅读1分钟

老规矩,什么是策略模式?

一种能让我们养成良好的编码习惯和重构思想的模式

假设有一个场景

需求如下

实现一个函数可以根据传入的type (计算方式) 和num (数字) 进行±1操作

哟,这需求简单,作为if/else资深工程师,这难不倒我。

function handleCalculation(type,num){
  // 加法
  if(type === 'add'){
    return num + 1
  }else{
    return num - 1
  }
}
handleCalculation('add',1) // 2

太平日子没过几天,产品经理又抽风了,说当时这个需求设计的有问题。±1要改成±2,切还要兼容乘以2和除以3

作为多年的if/else老玩家,开始奋笔疾书,赶出来的代码如下

function handleCalculation(type, num) {
  if (type === 'add') {
    return num + 1
  } else if (type === 'sub') {
    return num - 1
  } else if (type === 'multiply') {
    return num * 1
  } else {
    return num / 1
  }
}
handleCalculation('multiply',2) // 2

上面这段代码越看越臃肿,难道以后要新增其他运算,就要一直if/else吗?每一次新增需求,都会对原有函数体进行修改,增大了故障风险和测试成本。

突然想到,原来我之前学过策略模式,脑海中灵光一闪,这种可以通过对象来映射! 那我来改写一波。

const calculationFn = {
  add(num) {
    return num + 1
  },
  sub(num) {
    return num - 1
  },
  multiply(num) {
    return num * 1
  },
  divide(num) {
    return num / 1
  }
}
function handleCalculation(type, num) {
  return calculationFn[type](num)
}
handleCalculation('add', 2) // 3
handleCalculation('divide', 22);// 22

// 如果后续需要扩展其他运算方法,直接扩展即可。不需要更改原映射对象。
calculationFn.otherCalc = num => num / 10086
handleCalculation('otherCalc', 20172); // 2