前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >简化理解:策略设计模式

简化理解:策略设计模式

作者头像
掘金安东尼
发布2022-09-19 10:35:12
1930
发布2022-09-19 10:35:12
举报
文章被收录于专栏:掘金安东尼

theme: geek-black

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情


就在前不久,我们讲了创建对象的 3 种常见设计模式:工厂设计模式、构造函数设计模式、原型设计模式(蓦然回首,“工厂、构造、原型”设计模式,正在灯火阑珊处)。这 3 种设计模式,真切时刻发生在我们日常编码生活中,蓦然回首,灯火阑珊处。

本篇带来另外一种设计模式介绍,你或许天天和它打交道,但是不认识它,它就是“策略模式”。

策略模式就像诸葛亮的锦囊,它在代码中是这样体现的:

比方说,我们有一个销售活动,它有着不同的销售策略

代码语言:javascript
复制
function getPrice(originalPrice, status) {
  if (status === 'pre-sale') { // 预售打 8 折
    return originalPrice * 0.8
  }
  
  if (status === 'promotion') { // 促销打 9 折或者便宜 20
    if (origialPrice <= 100) {
      return origialPrice * 0.9
    } else {
      return originalPrice - 20
    }
  }

    if (status === 'black-friday') { // 周五有多种打折策略
    if (origialPrice >= 100 &amp;&amp; originalPrice < 200) {
      return origialPrice - 20
    } else if (originalPrice >= 200) {
      return originalPrice - 50
    } else {
      return originalPrice * 0.8
    }
  }
  
  if (status === 'default') { // 默认不打折
    return originalPrice
  }
}

这样写,有无毛病?

老观众都知道:当然是有的,它违反了“开闭原则”和“单一职责原则”。(这两个原则经常提到,敲重点)

为啥违反“开闭原则”?因为当你要加入一个新的策略的时候,要修改 getPrice 函数内部代码,这不是我们提倡的,我们提倡:不频繁修改函数体内部,通过预留的扩展接口来增加功能;

即:修改函数内部 ⇒ no,拓展函数功能 ⇒ yes

为啥违法“单一职责”?因为 getPrice 函数负责的判断太多了,又是这又是那的,职责太多,都没有解耦;

还有一个更大的问题,当其中的一种策略代码报错,会影响到整个 getPrice 函数的向下执行。

基于以上的原因,于是乎,策略模式闪亮登场!!

代码语言:javascript
复制
function preSalePrice(origialPrice) { // 预售打 8 折
  return originalPrice * 0.8
}

function promotionPrice(origialPrice) { // 促销打 9 折或者便宜 20
  if (origialPrice <= 100) {
    return origialPrice * 0.9
  } else {
    return originalPrice - 20
  }
}

function blackFridayPrice(origialPrice) { // 周五有多种打折策略
  if (origialPrice >= 100 &amp;&amp; originalPrice < 200) {
    return origialPrice - 20
  } else if (originalPrice >= 200) {
    return originalPrice - 50
  } else {
    return originalPrice * 0.8
  }
}

function defaultPrice(origialPrice) { // 默认不打折
  return origialPrice
}

let priceStrategies = { // 打折策略
  'pre-sale': preSalePrice,
  'promotion': promotionPrice,
  'black-friday': blackFridayPrice,
  'default': defaultPrice
}

function getPrice(originalPrice, status) { // 根据策略获取价格
  return priceStrategies[status](originalPrice)
}

优化后,代码从这样:

变成了这样:

图片来源

完美解决!!代码看起来更简洁、清晰。

如果你的代码有很多 if…else… 判断,各判断里的代码又相互独立,可考虑使用策略模式,封装各判断的代码,用 map 的方式,取出你的锦囊妙计吧

策略模式,就这,原来设计模式就在我们身边~~

参考:useful-design-patterns 作者:bytefish OK,以上便是本篇分享。点赞关注评论,为好文助力👍 我是掘金安东尼 🤠 100 万阅读量人气前端技术博主 💥 INFP 写作人格坚持 1000 日更文 ✍ 关注我,陪你一起度过漫长编程岁月 🌏

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • theme: geek-black
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档