javascript策略模式(strategy)

来源:互联网 发布:mysql minpoolsize 编辑:程序博客网 时间:2024/04/20 10:55

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。

例子:使用策略模式计算奖金

以计算年终奖为例,比如:绩效为S的年终奖是4倍工资,绩效为A的年终奖是3倍工资,绩效为B的是2倍工资。

看到这个要求,我第一反应就是使用万能的if-else判断,简单的不得了,看到书上果不其然给了最初的代码实现=_=。

这种初级代码面临的问题是,一旦需要判断的要求增加或更改,就不得不重写函数,函数也可能变得十分庞大。

第二个解决方式是采用组合函数重构代码。

也就是将if语句的实际操作写成各种不同的函数,然后在一个主函数中用if语句来调用各自的函数。在我看来这种做法好像有点多此一举=_=。

这里最后采用策略模式。

策略模式将变化和不变的部分分隔开,也就是将算法的使用和实现分开。一个基于策略模式的程序应该至少包含两个部分,第一部分是策略类(strategy),即具体的算法实现;第二部分是环境类(context),即算法的引用。


模仿面向对象

         var performanceS = function(){};    performanceS.prototype.calculate = function( salary ){    return salary*4;    };    var performanceA = function(){};    performanceA.prototype.calculate = function( salary ){    return salary*3;    };    var performanceB = function(){};    performanceB.prototype.calculate = function( salary ){    return salary*2;    };    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.calculate( this.salary );  //计算<span style="font-family:KaiTi_GB2312;">奖金的操作委托给对于的策略对象</span>    };        var bonus = new Bonus();     bonus.setSalary( 10000 );     bonus.setStrategy( new performanceS() );       //设置策略对象     alert( bonus.getBonus() );     //输出40000

将策略对象传入bonus后,在getBonus中将计算交给策略对象的calculate方法,同时传入bonus的salary值。



Javascript的策略模式

在javascript中函数也是对象,所以更简单直接的方法是把strategy直接定义为函数

        var strategies = {        "S": function( salary ){        return salary * 4;        },        "A": function( salary ){        return salary * 3;        },        "B": function( salary ){        return salary * 2;        }        };        var calculateBonus = function( level ,salary ){        return strategies[level]( salary );        };        alert( calculateBonus('S' , 20000) );

我们用calculateBonus作为context来接受用户的请求。这样代码简洁了许多。这种javascript的策略模式之前没有接触过,看了书以后才知道,简直棒呆。


0 0