JavaScript设计模式之策略模式详解
在程序设计中,我们也常常遇到这种情况,要实现某一个功能我们有很多种算法可以实现。
这些算法灵活多样,而且可以随意互相替换。这种解决方案就是所谓的策略模式。
策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。
/*
*pre:策略模式
*示例:公司计算奖金,分A、B、C三种绩效,计算方式如下
*绩效为A,奖金乘以系数5
*绩效为B,奖金乘以系数4
*绩效为C,奖金乘以系数3
*/
//--------示例1----------
varcalculateBonus=function(performanceLevel,salary){
if(performanceLevel==='A'){
returnsalary*5;
}
if(performanceLevel==='B'){
returnsalary*4;
}
if(performanceLevel==='C'){
returnsalary*3;
}
};
console.log(calculateBonus('A',2000));
/*
缺点:1、函数体系庞大,拥有太多的if-else语句;
2、如果增加绩效D,需修改内部函数,违背封闭-开放原则;
3、复用性差,其他地方如果用到计算奖金,只能赋值黏贴;
*/
//---------示例2------------
varperformanceA=function(salary){
returnsalary*5;
};
varperformanceB=function(salary){
returnsalary*4;
};
varperformanceC=function(salary){
returnsalary*3;
};
varcalculateBonus=function(performanceLevel,salary){
if(performanceLevel==='A'){
returnperformanceA(salary);
}
if(performanceLevel==='B'){
returnperformanceB(salary);
}
if(performanceLevel==='C'){
returnperformanceC(salary);
}
};
console.log(calculateBonus('A',2000));
/*
缺点:1、函数体系庞大,系统变化时缺乏弹性
*/
//---------示例3------------
//策略模式重构:定义一系列算法,将它们一个个封装起来。
varperformanceA=function(){};
performanceA.prototype.caculate=function(salary){
returnsalary*5;
};
varperformanceB=function(){};
performanceB.prototype.caculate=function(salary){
returnsalary*4;
};
varperformanceC=function(){};
performanceC.prototype.caculate=function(salary){
returnsalary*3;
};
varBonus=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(){
returnthis.strategy.caculate(this.salary);
}
varbonus=newBonus();
bonus.setSalary(2000);
bonus.setStrategy(newperformanceA());
console.log(bonus.getBonus());
//-----------示例4---------------
//javaScript版本
varStrategies={
"A":function(salary){
returnsalary*5;
},
"B":function(salary){
returnsalary*4;
},
"C":function(salary){
returnsalary*3;
}
};
varcaculateBonus=function(level,salary){
returnStrategies[level](salary);
};
console.log(caculateBonus("A",2000));
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。