策略模式
定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
询价逻辑
商品的定价逻辑
javascript
function askPrice(tag, originPrice) {
// 处理大促价
if(tag === 'onSale') {
if(originPrice >= 100) {
return originPrice - 30
}
return originPrice * 0.8
}
// 处理尝鲜价
if(tag === 'fresh') {
return originPrice * 0.5
}
}
如果我们现在改了需求,需要新增一个新人价时,又要添加一条 if-else 逻辑
javascript
function askPrice(tag, originPrice) {
...
// 处理新人价
if(tag === 'newUser') {
if(originPrice >= 100) {
return originPrice - 50
}
return originPrice
}
}
对象映射
这是违背了单一原则和开放封闭原则。如果修改一个逻辑,函数的逻辑全部都要重新测试。这里使用对象映射将询价标签 --> 询价逻辑的映射关系明确下来。
javascript
const priceProcessor = {
onSale(originPrice) {
if (originPrice >= 100) {
return originPrice - 30;
}
return originPrice * 0.8;
},
fresh(originPrice) {
return originPrice * 0.5;
},
};
当我们需要某一个询价时,通过询价标签去定位到询价逻辑
javascript
// 询价函数
function askPrice(tag, originPrice) {
return priceProcessor[tag](originPrice)
}
也可以扩展新的询价
javascript
priceProcessor.newUser = function (originPrice) {
if (originPrice >= 100) {
return originPrice - 50;
}
return originPrice;
}
这样也不用修改整个询价逻辑。
总结
在文中开始的策略模式定义,猛一看这是啥?所以其实就是策略模式就是对象映射
算法,就是我们这个场景中的询价逻辑,它也可以是你任何一个功能函数的逻辑;“封装”就是把某一功能点对应的逻辑给提出来;“可替换”建立在封装的基础上,只是说这个“替换”的判断过程,咱们不能直接怼 if-else,而要考虑更优的映射方案。
策略模式是我们解决 if-else 的一大法宝。