策略模式的定义是: 定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。
很多公司的年终奖是根据员工的工资基数和年底绩效情况来发放的。例如,绩效为 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 函数缺乏弹性,如果增加了一种新的绩效等级 C,或者想把绩效 S 的奖金系数改为 5, 那我们必须深入 calculateBonus 函数的内部实现,这是违反开放封闭原则的。 算法的复用性差,如果在程序的其他地方需要重用这些计算奖金的算法呢?我们的选择只有复制和粘贴。
JavaScript的策略模式
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 ) ); // 输出: 80000console.log( calculateBonus( 'A', 10000 ) ); // 输出: 30000
这样算法和规则分开了,可以根据需要修改对应的内容就可以实现自己想要的功能
常见的使用策略模式的地方是jq动画中的运动模式,就是把不同的运动策略传入jq动画中