JavaScript策略模式实战:动态管理折扣计算逻辑
本文通过书店折扣计算案例,对比传统if-else判断与策略模式实现的差异。策略模式利用闭包封装折扣中心,提供添加和删除算法的方法,实现计算逻辑与调用环境的解耦。该方法易于扩展新活动且无需修改核心代码,有效解决了硬编码带来的维护难题,提升代码的可读性与灵活性。
策略模式核心概念与场景
前言
策略设计模式的核心在于将一个问题对应多种解决方案,系统无需预先确定具体使用哪一种,且支持在运行时动态增加新的方案。
例如购书时书店常设满减或折扣活动,如满100减20、满200减50及八折等,且活动持续更新,后续可能新增如双11期间七折等优惠,活动结束后需移除相应活动。
若不使用策略模式,我们通常会编写一个接收价格和折扣类型两个参数的函数,内部通过if语句判断折扣类型并计算最终价格。若无折扣则返回原价,最后返回计算后的金额。
传统实现方式的局限性
//price 价格
//type 折扣种类
function calcPrice(price, type) {
if (type == '100_20') {
price -= 20
} else if (type == '200_50') {
price -= 50
}
return price;
}
// 使用
const bookPrice = calcPrice(300, '100_20')
当折扣活动较少时,这种方式尚可接受。但随着活动增多,每次新增折扣都需在函数中添加对应的if判断及字段,还需确保新折扣名称不与现有冲突。此外,活动过期时需手动删除相关if分支,导致代码冗余且难以维护。
接下来演示如何使用策略设计模式实现上述功能:
我们定义一个闭包函数,内部维护一个折扣种类中心,包含默认的几种折扣算法。该函数对外暴露计算折扣价格的方法,同时附加添加和删除折扣种类的方法,最后将计算接口返回供外部调用。
基于闭包的策略模式实现
//计算折扣价格闭包函数
const calcPrice = (function() {
// 折扣种类中心
const sale = {
//100-20折扣活动
'100_20': function(price) {
return price -= 20
},
//200-50折扣活动
'200_50': function(price) {
return price -= 50
},
//打八折折扣活动
'80%': function(price) {
return price *= 0.8
},
}
/** *
* 计算折扣价格
* price 价格
* type 折扣类型
* **/
function totalPrice(price, type) {
// 判断折扣种类里面是否拥有这个折扣类型,如果有就执行,没有就返回原价
if (sale[type]) {
// 使用折扣函数
price = sale[type](price)
}
// 返回价格
return price
}
/**
*
* 添加折扣方法
* type 折扣类型
* callback 折扣类型方法
* **/
totalPrice.add = function(type, callback) {
// 判断折扣类型是否存在
if (sale[type]) return '折扣已存在'
//给折扣类型中心添加折扣价格方法
sale[type] = callback
return '折扣方法添加成功'
}
// 删除折扣方法
totalPrice.del(type){
//通过delete关键字删除折扣类型中心方法
delete sale[type]
}
// 被return出去的函数,才是计算价格的本体
return totalPrice
})();
//使用计算价格
const bookPrice = calcPrice(240, '200_50');
//添加打七折折扣类型方法
calcPrice.add('70%',function(price) {return price *= 0.7 })
//删除打八折折扣类型方法
calcPrice.add('80%')策略设计模式具备易于维护、易于理解以及易于扩展的特点。
本文介绍了JavaScript中策略模式的实际应用案例,更多相关策略模式内容可参考本站历史文章或继续浏览后续内容,感谢大家的支持。
JS处理含Emoji或中文的字符串转数组乱码问题
2026-11-05 16:12:28
JS怎么使用展开运算符合并对象
2026-11-05 14:42:18
ES6+环境下判断JS对象为空的简洁写法
2026-11-05 12:12:23
怎么通过replacer函数自定义JS中JSON的格式化输出
2026-11-05 11:19:44
JS正则表达式基础:字面量与RegExp构造函数的区别及常用元字符
2026-11-05 11:16:58
