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
- javascript策略模式(strategy)
- 策略(Strategy)模式
- Strategy(策略)模式
- 策略(Strategy)模式
- Strategy(策略模式)
- 策略模式(Strategy)
- 策略模式(Strategy)
- Strategy(策略模式)
- 策略模式(Strategy)
- 策略模式(Strategy)
- 策略(strategy)模式
- 策略模式(strategy)
- 策略(strategy)模式
- 策略模式(Strategy)
- 策略模式(Strategy)
- 策略模式(Strategy)
- 策略模式(Strategy)
- Strategy(策略模式)
- Create a thread demo
- 在线渗透工具大全
- First Bad Version
- JZOJ 3466.选课(select)
- 年月日三级联动(纯JS)
- javascript策略模式(strategy)
- LeetCode - 345. Reverse Vowels of a String
- 【3003】&&【9105】高精度求积 【高精度压位】
- 区分各关系
- 勾股定理一日一证连载44
- NOIP 2010 关押罪犯
- 主席树模板求不带修改的区间k大
- BZOJ2656 [Zjoi2012]数列(sequence)
- [Cloud Computing]Mechanisms: Certificate