使用场景:为了解决if-else 或 switch 分支引起的逻辑耦合,扩展性差等问题,可以使得代码有更高的可读性和可维护性。
- 首先是单一职责,保证每个函数职责独立,提高了代码的可读性和可复用性,由于函数的粒度变小了,bug的调试也会方便许多。 => 如果都放在一个函数中写所有的逻辑,之后新增业务逻辑,需要把整个函数重新回归测试。
- 其次是重点,通过对象的
key-value映射的巧妙方式,使得这些计算函数(算法)可以根据类型进行替换,同时也拥有很强的扩展性。
例子: 年终奖计算
const typeMap = {
// 计算typeA年终奖
typeA(salary, sales) {
return salary * 0.8 + sales * 0.5
},
// 计算typeB年终奖
typeB(salary, sales) {
return salary * 1.2 + sales * 0.3
},
// 计算typeC年终奖
typeC(salary, sales) {
return salary * 2
}
}
// 计算年终奖
function getAnnualBonus(type, salary, sales) {
return typeMap[type](salary, sales)
}
如果之后扩展,新增年终奖类型和计算方式,只需要新增typeMap对象属性即可。
实际应用: 实际项目中,不同环境的域名、地址之类的环境配置也不同,就可以采用策略模式来实现。