JavaScript设计模式之策略模式详解
程序员文章站
2024-01-07 21:37:16
在程序设计中,我们也常常遇到这种情况,要实现某一个功能我们有很多种算法可以实现。
这些算法灵活多样,而且可以随意互相替换。这种解决方案就是所谓的策略模式。
策略...
在程序设计中,我们也常常遇到这种情况,要实现某一个功能我们有很多种算法可以实现。
这些算法灵活多样,而且可以随意互相替换。这种解决方案就是所谓的策略模式。
策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。
/* * 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));
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。