策略模式的目的就是将算法的使用与算法的实现分离开来;
将不变的部分和变化的部分隔开是每个设计模式的主题;
搬一个《设计模式与开发实践》中的例子。
关于绩效工资的计算:
// 普通的写法
var calculateBonus = function( performanceLevel, salary ){
if ( performanceLevel === 'S' ){
return salary * 4;
}
if ( performanceLevel === 'A' ){
return salary * 3;
}
if ( performanceLevel === 'B' ){
return salary * 2;
}
};
calculateBonus('S',20000);
- 这段代码最大的问题就是:弹性差,绩效规则一变就要去改函数,新加一套规则那就更难受了;
- 问题出在:算法的设计和算法的使用,混杂在了一起;
- 所以我们要把算法的设计分离出来;
// 使用了策略模式
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 );
};
calculateBonus( 'S', 20000 );
- strategies是一个策略类,calculateBonus函数接受参数后会把请求委托给一个策略类;
- strategies是算法的实现,一般不变;
- calculateBonus是对算法的使用,可变;
- 将不变的部分和变化的部分隔开是每个设计模式的主题;