写点什么

【策略模式】就像诸葛亮的锦囊

作者:掘金安东尼
  • 2022 年 7 月 25 日
  • 本文字数:1353 字

    阅读完需:约 4 分钟

【策略模式】就像诸葛亮的锦囊

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


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


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


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 && 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 函数的向下执行。


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


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 && 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 日更文 ✍ 关注我,陪你一起度过漫长编程岁月 🌏

发布于: 2 小时前阅读数: 10
用户头像

还未添加个人签名 2022.07.14 加入

社会我瓜哥,人狠话不多😎 微信 anthony1453,加我交个朋友😎 正联合【机械工业出版社】出版《程序员成长手册》,敬请期待😎 真正的大师,永远怀着一颗学徒的心(易)😎

评论

发布
暂无评论
【策略模式】就像诸葛亮的锦囊_前端_掘金安东尼_InfoQ写作社区