JavaScript设计模式之策略模式详解

时间:2021-05-26

在程序设计中,我们也常常遇到这种情况,要实现某一个功能我们有很多种算法可以实现。

这些算法灵活多样,而且可以随意互相替换。这种解决方案就是所谓的策略模式。

策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。

/* * 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));//--------- 示例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)); //--------- 示例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));

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章