策略模式有着广泛的应用。本节我们就以年终奖的计算为例进行介绍。
很多公司的年终奖是根据员工的工资基数和年底绩效情况来发放的。例如,绩效为 S的人年
终奖有 4倍工资,绩效为 A的人年终奖有 3倍工资,而绩效为 B的人年终奖是 2倍工资。假设财
务部要求我们提供一段代码,来方便他们计算员工的年终奖。
一开始,你可能会这样组织你的代码
var calculateBonus = function(performanceLevel, salary) { if(performanceLevel === 'S') { return salary * 4; } if(performanceLevel === 'A') { return salary * 3; } if(performanceLevel === 'B') { return salary * 2; } }; calculateBonus('B', 20000); // 输出:40000 calculateBonus('S', 6000); // 输出:24000
当然,这样写没毛病,但是有几个缺点。
- calculateBonus 函数比较庞大,包含了很多 if-else 语句,这些语句需要覆盖所有的逻辑
- calculateBonus 函数缺乏弹性,如果增加了一种新的绩效等级 C,或者想把绩效 S 的奖金系数改为 5,那我们必须深入 calculateBonus 函数的内部实现,这是违反开放封闭原则的。
- 算法的复用性差,如果在程序的其他地方需要重用这些计算奖金的算法呢?我们的选择只有复制和粘贴。
接下来使用策略模式来重构代码,对比一下
var strategies = { "S": function(salary) { return salary * 4; }, "A": function(salary) { return salary * 3; }, "B": function(salary) { return salary * 2; } }; var calculateBonus = function(level, salary) { return strategies[level](salary); }; console.log(calculateBonus('S', 20000)); // 输出:80000 console.log(calculateBonus('A', 10000)); // 输出:30000
这样看起来不是好了很多吗,维护起来方便,代码精简。而不是一堆if else判断语句,快去重构你的代码,把if判断干掉吧。