定义
策略模式指的是定义一系列算法,把它们一个个封装起来。目的是将算法的使用与算法的实现分离开来。
一个基于策略模式的程序至少由两部分组成。第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。第二个部分是环境类Context,Context接受客户的请求,随后把请求委托给某一个策略类。要做到这点,说明Context中要维持对某个策略对象的引用。
第一版重构
var performanceS = function() {};
performanceS.prototype.calculate = function(salary) {
return salary * 4
}
var performaceA = function() {};
performanceA.prototype.calculate = function(salary) {
return salary * 3;
}
var performanceB = function() {};
performanceB.prototype.calculate = function(salary) {
return salary * 2;
}
// 定义奖金类
var Bonus = function() {
this.salary = null;
this.strategy = null;
}
Bonus.prototype.setSalary = function(salary) {
this.salary = salary;
}
Bonus.prototype.setStrategy = function(strategy) {
this.strategy = strategy;
}
Bonus.prototype.getBonus = function() {
return this.strategy.calculate(this.salary);
}
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);
}
策略模式的优缺点
优点:
- 策略模式利用组合、委托和多态等技术和思想,可以有效地避免多重条件选择语句。
- 策略模式提供了对开放——封闭原则的完美支持,将算法封装在独立里的strategy中,使得它们易于切换,易于扩展。
- 策略模式中的算法也可以复用在系统的其他地方,从而避免重复的复制粘贴工作
- 在策略模式中利用组合和委托来让Context拥有执行算法的能力,这也是继承的一种更轻便的替代方案。
缺点:
- 违反最少知识原则。
一等函数对象与策略模式
var S = function(salary) {
return salary * 4
}
var A = function(salary) {
return salary * 3
}
var B = function(salary) {
return salary * 2
}
var calculateBonus = function(func, salary) {
return func(salary);
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。