您的位置:首页 > Web前端 > JavaScript

JS设计模式之策略模式

2017-11-19 22:52 295 查看
策略模式:将定义的一组算法封装起来,使其相互之间可以替换。封装的算法具有一定独立性,不会随客户端变化而变化。策略模式主要是一种用于处理多种分支判断的模式。

生活中的例子

大家在工作中基本都是有绩效考核的,这个绩效考核关乎奖金的发放。比如说:绩效S的发放工资的4倍奖金,A的发放3倍奖金,B的发放2倍。用程序实现奖金的计算规则。

var calculateBonus = function( performanceLevel, salary ){
if ( performanceLevel === 'S' ){
return salary * 4;
}
if ( performanceLevel === 'A' ){
return salary * 3;
}
if ( performanceLevel === 'B' ){
return salary * 2;
}
};
calculateBonus( 'B', 20000 ); // 输出:40000
calculateBonus( 'S', 6000 ); // 输出:24000


我们用最直观的方法来计算奖金,但是这么做有诸多弊端。

1、calculateBonus 函数比较庞大,包含了很多 if-else 语句,这些语句需要覆盖所有的逻辑

分支。

2、calculateBonus 函数缺乏弹性,如果增加了一种新的绩效等级 C,或者想把绩效 S 的奖金

系数改为 5,那我们必须深入 calculateBonus 函数的内部实现,这是违反开放封闭原则的。

3、算法的复用性差,如果在程序的其他地方需要重用这些计算奖金的算法呢?我们的选择

只有复制和粘贴。

使用策略模式重构代码:

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 );
};
console.log( calculateBonus( 'S', 20000 ) ); // 输出:80000
console.log( calculateBonus( 'A', 10000 ) ); // 输出:30000


代码清晰了很多,也便于维护。

实际应用

表单提交是十分常见的。经常我们需要验证表达的正确性。这个时候我们便可以使用策略模式来一次校验不同表单类型的校验。

var formValidator = (function() {
var strategy = {
//验证是否为空
isNull: function(val) {
return /\S+/.test(val) ? '请输入内容' : '';
},
//验证手机号码是否输入正确
phone: function(val) {
return !/^1[3|4|5|8][0-9]\d{4,8}$/.test(val) ? '请输入正确的手机号码' : '';
}
}
return {
check: function(type, val) {
return strategy[type] ? strategy[type](val) : '没有该类型的检测方法'
},
//添加新的策略
addStrategy(type, fn) {
strategy[type] = fn;
}
}
})();
var isPhone = formValidator.check('phone', '111111111111')
console.log(isPhone)//请输入正确的手机号码


我们还可以用addStrategy添加新的校验规则。

策略模式使得算法脱离于模块逻辑而独立管理,使我们可以专心研发算法,而不必受模块逻辑所约束。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: