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));
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。