核心:定义一系列算法,并将每个算法封装在具有共同接口的单独对象中,并可替换。
场景:处理一系统相同但有细微差别的逻辑
代码实现:根据绩效计算奖金
未使用策略模式:代码写死了
function getMoney(jixiao, baseMoney) {
if(jixiao === 's') return baseMoney * 2
else if(jixiao === 'a') return baseMoney * 1.5
else if(jixiao === 'b') return baseMoney * 1
else if(jixiao === 'c') return baseMoney * 0.8
else if(jixiao === 'd') return baseMoney * 0.5
else return baseMoney * 0
}
getMoney('s', 1000) // 2000
getMoney('a', 1000) // 1500
getMoney('c', 1000) // 800
使用了策略模式:策略可随时替换
// 奖金策略 1
const moneyStrategie1 = {
s(baseMoney) {
return baseMoney * 2
},
a(baseMoney) {
return baseMoney * 1.5
},
b(baseMoney) {
return baseMoney * 0.8
},
c(baseMoney) {
return baseMoney * 0.5
},
d(baseMoney) {
return baseMoney * 0
}
}
// 奖金策略 2
const moneyStrategie2 = {
s(baseMoney) {
return baseMoney * 20
},
a(baseMoney) {
return baseMoney * 15
},
b(baseMoney) {
return baseMoney * 8
},
c(baseMoney) {
return baseMoney * 5
},
d(baseMoney) {
return baseMoney * 0
}
}
function getMoney(strategy) {
this.calcMoney = (jixiao, baseMoney) => {
return strategy[jixiao](baseMoney)
}
}
// 使用奖金策略 1
const getMoney1 = new getMoney(moneyStrategie1)
getMoney1('s', 1000) // 2000
getMoney1('a', 1000) // 1500
getMoney1('c', 1000) // 800
// 使用奖金策略 2
const getMoney2 = new getMoney(moneyStrategie2)
getMoney1('s', 1000) // 20000
getMoney1('a', 1000) // 15000
getMoney1('c', 1000) // 8000
总结:就是将零散的判断逻辑,封装在单独的对象中,并提供一个策略切换函数。