JS设计模式之策略模式

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

生活中的例子

大家在工作中基本都是有绩效考核的,这个绩效考核关乎奖金的发放。比如说:绩效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添加新的校验规则。
策略模式使得算法脱离于模块逻辑而独立管理,使我们可以专心研发算法,而不必受模块逻辑所约束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值