在程序设计中,我们也常常遇到这种情况,要实现某一个功能我们有很多种算法可以实现。
这些算法灵活多样,而且可以随意互相替换。这种解决方案就是所谓的策略模式。
策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。
/** pre:策略模式* 示例:公司计算奖金,分A、B、C 三种绩效,计算方式如下* 绩效为A,奖金乘以系数5* 绩效为B,奖金乘以系数4* 绩效为C,奖金乘以系数3*///-------- 示例1 ----------var calculateBonus = function(performanceLevel, salary) {if(performanceLevel === 'A') {return salary * 5;}if(performanceLevel === 'B') {return salary * 4;}if(performanceLevel === 'C') {return salary * 3;}};console.log(calculateBonus('A', 2000));/*缺点:1、函数体系庞大,拥有太多的if-else语句;
2、如果增加绩效D,需修改内部函数,违背封闭-开放原则;
3、复用性差,其他地方如果用到计算奖金,只能赋值黏贴;
*///--------- 示例2 ------------var performanceA = function(salary) {return salary * 5;};var performanceB = function(salary) {return salary * 4;};var performanceC = function(salary) {return salary * 3;};var calculateBonus = function(performanceLevel, salary) {if(performanceLevel === 'A') {return performanceA(salary);}if(performanceLevel === 'B') {return performanceB(salary);}if(performanceLevel === 'C') {return performanceC(salary);}};console.log(calculateBonus('A', 2000));/*缺点:1、函数体系庞大,系统变化时缺乏弹性*///--------- 示例3 ------------// 策略模式重构:定义一系列算法,将它们一个个封装起来。
var performanceA = function(){};performanceA.prototype.caculate = function(salary){return salary * 5;};var performanceB = function(){};performanceB.prototype.caculate = function(salary){return salary * 4;};var performanceC = function(){};performanceC.prototype.caculate = function(salary){return salary * 3;};
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.caculate(this.salary);}
var bonus = new Bonus();bonus.setSalary(2000);bonus.setStrategy(new performanceA());console.log(bonus.getBonus());
// ----------- 示例4 ---------------// javaScript版本var Strategies = {"A":function(salary){return salary * 5;},"B":function(salary){return salary * 4;},"C":function(salary){return salary * 3;}};var caculateBonus = function(level,salary){return Strategies[level](salary);};console.log(caculateBonus("A",2000));以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:js单例模式的两种方案JS实现单例模式的6种方案汇总javascript 单例模式演示代码 javascript面向对象编程JavaScript的单例模式 (singleton in Javascript)轻松掌握JavaScript单例模式[js高手之路]单例模式实现模态框的示例javascript设计模式--策略模式之输入验证JavaScript设计模式之策略模式实例学习JavaScript设计模式之策略模式学习JavaScript设计模式(策略模式) javascript单例模式与策略模式实例详解
