再一次,javascript设计模式与开发实践-策略模式

简述

定义一系列的算法,把它们一个个封装起来,并使它们可以相互替换。

在现实中要去一个地方,可以选择坐飞机、火车、骑自行车。
在程序设计中,也有类似的情况,例如压缩文件,可以选择zip算法,也可以选择gzip算法。

任意替换一种方式,目的不变就是策略模式。

使用场景

  • 算法
  • 表单验证
  • 运动动画

案例

有些公司的年终奖是根据员工的工资基数和绩效来发放的,例如绩效为S的有4倍工资,绩效为A的有3倍工资等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var strategies = {
    S: function (salary) {
        return salary * 4;
    },
    A: function (salary) {
        return salary * 3;
    }
};

var calculateBonus = function (level, salary) {
    return strategies[level](salary);
};

console.log(calculateBonus('S', 20000)); // 80000
console.log(calculateBonus('A', 10000)); // 30000

假如明年公司规定绩效为B的员工可以发放2倍工资,那么仅需要扩展strategies即可,而原计算逻辑可不变。

1
2
3
4
5
6
strategies.B = function (salary) {
    return salary * 2;
};

console.log(calulateBonus('B', 8000)); // 16000