概念
策略模式(Strategy Pattern)又叫政策模式(Policy Pattern),属于行为型设计模式。它是指定义了不同的算法逻辑,并将其封装起来,让它们之间可以互相替换,此模式可以让算法逻辑发生变化时不会影响到使用算法逻辑的用户。
策略模式可以用于改造代码中的if…else逻辑。
使用场景
同一个系统中存在不同的逻辑算法,而彼此之间在不同场景中需要实现动态替换。
- 一个人的交税比率与他的工资有关,不同工资对应不同的税率
- 根据绩效发放年终奖金,绩效分A B C等级,根据不同的等级发放多或少的奖金
- 互联网移动支付,每次下单后付款都需要选择支付方式
- 商场打折促销活动,有双11活动,双12活动,彼此之间可以相互替换
- 旅行采用的不同的交通工具,飞机,高铁,动车,汽车,火车等等
- form 表单验证,对每一个输入框进行验证,可以验证是否为空,最小长度,是否符合电话号码等等
策略模式示例
发放奖金规则:绩效得A的员工,将拿到原本工资*3倍的钱;绩效得B的员工,将拿到原本工资*2倍的钱;绩效得C的员工,将拿到原本工资*1.5倍的钱。
我们通常这样写
// original:原本的工资 grade:绩效等级
function calcSalary(original, grade) {
let final;
if (grade === "A") {
final = original * 3
} else if (grade === "B") {
final = original * 2
} else if (grade === "C") {
final = original * 1.5
}
return final
}
console.log(calcSalary(2000,'A'))
// 6000
console.log(calcSalary(2000,'B'))
//4000
console.log(calcSalary(2000,'C'))
//3000
使用策略模式重构代码
再回顾一遍策略模式的定义:定义一系列算法,把它们一个个封装起来,并且它们可以相互替换。
我们可以观察在计算绩效奖金的过程中,算法的使用方式是不变的,都是根据某个算法取得计算后的奖金数额。而算法的实现是各异和变化的,每种绩效对应着不同的计算规则。一个基于策略模式的程序至少由两部分组成,一组策略和一个调用环境。接下来看一下具体实现:
//一组策略
var strategies = {
"A": function(original) {
return original * 3
},
"B": function(original) {
return original * 2
},
"C": function(original) {
return original * 1.5
}
}
// 创建一个调用环境
function calcSalary(original, grade) {
return strategies[grade](original)
}
console.log(calcSalary(2000,'A'))
// 6000
console.log(calcSalary(2000,'B'))
// 4000
console.log(calcSalary(2000,'C'))
// 3000