老规矩,什么是策略模式?
一种能让我们养成良好的编码习惯和重构思想的模式
假设有一个场景
需求如下
实现一个函数可以根据传入的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