javascript策略模式(strategy)

本文通过年终奖计算案例介绍了策略模式的应用,展示了如何通过策略模式将算法的使用与实现分离,提高代码的灵活性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

以计算年终奖为例,比如:绩效为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的策略模式之前没有接触过,看了书以后才知道,简直棒呆。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值