Skip to content
On this page

策略模式

定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

询价逻辑

商品的定价逻辑

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 的一大法宝。