策略模式在前端的应用
策略模式
定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换策略模式一般分为策略类(封装具体算法,负责策略的具体逻辑计算) + 环境类(接收用户请求,把请求委托给某一策略),将算法的使用和算法的实现分离开来,消除大量条件分支语句。
在具体应用中,我们常常会遇到根据状态,选择不同的处理逻辑。通常会用if-else来处理,或者switch。但是大量业务逻辑和状态判断封装在一起,函数显得冗余又杂乱。
文章图片
那应该怎么做?
以超市打折的场景为例:
当价格类型为“预售价”时,满 100 - 20,不满 100 打 9 折
当价格类型为“大促价”时,满 100 - 30,不满 100 打 8 折
当价格类型为“返场价”时,满 200 - 50,不叠加
当价格类型为“尝鲜价”时,直接打 5 折
- 首先,对每种状态的逻辑处理封装成函数(对应策略类)。然后判断类型,选择处理函数(对应环境类)。
// 处理预热价
function prePrice(originPrice) {
if(originPrice >= 100) {
return originPrice - 20
}
return originPrice * 0.9
}// 处理大促价
function onSalePrice(originPrice) {
if(originPrice >= 100) {
return originPrice - 30
}
return originPrice * 0.8
}// 处理返场价
function backPrice(originPrice) {
if(originPrice >= 200) {
return originPrice - 50
}
return originPrice
}// 处理尝鲜价
function freshPrice(originPrice) {
return originPrice * 0.5
}// 处理新人价
function newUserPrice(originPrice) {
if(originPrice >= 100) {
return originPrice - 50
}
return originPrice
}function askPrice(tag, originPrice) {
// 处理预热价
if(tag === 'pre') {
return prePrice(originPrice)
}
// 处理大促价
if(tag === 'onSale') {
return onSalePrice(originPrice)
}// 处理返场价
if(tag === 'back') {
return backPrice(originPrice)
}// 处理尝鲜价
if(tag === 'fresh') {
return freshPrice(originPrice)
}// 处理新人价
if(tag === 'newUser') {
return newUserPrice(originPrice)
}
}
但是,代码看起来好像还是很冗余,并且没有实现“对扩展开放,对修改封闭”的效果。其中在判断类型时还是采用多个if-else语句来实现与处理函数的映射关系,那么在 JS 中,有没有什么既能够既帮我们明确映射关系,同时不破坏代码的灵活性的方法呢?答案就是对象映射!
- 把逻辑处理函数封装在一个对象
// 定义一个询价处理器对象
const priceProcessor = {
pre: originPrice => {
if (originPrice >= 100) {
return originPrice - 20;
}
return originPrice * 0.9;
},
onSale:originPrice => {
if (originPrice >= 100) {
return originPrice - 30;
}
return originPrice * 0.8;
},
back: originPrice => {
if (originPrice >= 200) {
return originPrice - 50;
}
return originPrice;
},
fresh: originPrice => {
return originPrice * 0.5;
},
};
- 当需要某个类型对应处理函数时,可直接调用对象方法
function askPrice(tag, originPrice) {
return priceProcessor[tag](originPrice)
}
- 如果想新增策略,只需要给对象添加一个方法
priceProcessor.newUser = function (originPrice) {
if (originPrice >= 100) {
return originPrice - 50;
}
return originPrice;
}
【策略模式在前端的应用】总结:在日常使用中,如果有大量状态判断以及逻辑处理,可以采用策略模式,将状态判断以及逻辑处理拆分,消除大量条件分支语句,同时实现“对扩展开放,对修改封闭”的原则。不要做if-else侠啦!
推荐阅读
- 投稿|红星美羚“失蹄”在前,美庐生物IPO之路是否会重蹈覆辙?
- Win10公文包怎样同步?公文包与文件夹的区别在啥地方?
- 如何在Android中正确设置谷歌播放登录()
- 当我正在尝试为我正在通过Unity开发的游戏构建apk文件时,Android SDK未正确安装错误()
- 访问设备/模拟器文件系统在Android Studio中
- 如何在Android应用程序中添加垂直滚动条( [关闭])
- 在android中是否有任何方法可以获得设备虚拟键盘的高度
- 在android模拟器中禁用menubutton
- 如何在HTML中运行具有依赖项jar文件的Applet
- JS框架会在2020年引发一场前端革命吗()