定义
定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换
代码示例
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));
console.log(calculateBonus('A', 10000));
将所有的算法封装到策略( strategy )对象中,使用一个服务( service )方法判断根据客户端调用传入的不同参数实施不同的策略。使用策略模式后的代码,通用性、复用率大大提升可以在多场合使用或者封装为插件。
优点
策略模式利用组合、委托和多态等技术和思想,可以有效地避免多重添加选择语句。
策略模式提供了对开放 - 封闭等技术和思想,将算法封装在独立的 strategy 中,使得它们易于切换,易于理解,易于扩展。
策略模式中的算法也可以复用在系统的其它地方,从而避免许多重复的复制粘贴工作。
在策略模式中利用组合和委托来让 Context 用于执行算法的能力,这也是继承的替代方案。
一等函数对象与策略模式
在JavaScript 语言中函数作为一等对象,策略模式是隐形的。strategy 就是值为函数的变量。除了使用类来封装算法和行为外,使用函数也是一种选择。这些算法可以到处被传递,策略模式融入语言本身,我们对函数发出调用的消息时,不同函数执行2返回不同的执行结果。JavaScript 中函数的多态性变得更为简单。
实例代码
var S = function(salary) {
return salary * 4;
};
var S = function(salary) {
return salary * 3;
};
var S = function(salary) {
return salary * 2;
};
var calculateBonus = function(func, salary) {
return func( salary );
};
calculateBonus( S, 10000 ); // 40000
参考
[1] JavaScript 设计模式与开发实践 @ 曾探