例子:购物车结算时有多种折扣计算方式,满100-10,满200-25,8折,7折,这种逻辑我们可以用基本代码实现
function calcPrice(price, type) {
if (type === '100-10') {
price -= 10
} else if (type === '200-25') {
price -= 25
} else if (type === '80%') {
price *= 0.8
}
return price
}
const res = calcPrice(320, '100-10')
显而易见,这段代码虽然实现了我们想要的功能,但是很局限,有以下几种缺点:
const calcPrice = (function () {
const sale = {
'100-10': function (price) { return price -= 10 },
'200-25': function (price) { return price -= 25 },
'80%': function (price) { return price *= 0.8 }
}
return function(price,type) {
// 判断对象里有没有这个折扣类型
if (!sale[type]) return '没有这个折扣'
return sale[type](price)
}
})()
console.log(calcPrice(320,'100-10'))
// 替换 Context 中当前保存的策略对象,便能执行不同的算法来得到我们想要的结果。
// 增加添加和删除折扣的接口
const calcPrice = (function () {
const sale = {
'100-10': function (price) {return price -= 10},
'200-25': function (price) {return price -= 25},
'80%': function (price) {return price *= 0.8}
}
function calcPrice(price, type) {
if (!sale[type]) return '没有这个折扣'
return saletype
}
calcPrice.add = function (type, fn) {
// 判断折扣是否存在
if (sale[type])
sale[type] = fn
return '添加成功'
}
// 删除折扣
calcPrice.del = function (type) {
delete sale[type]
}
return calcPrice
})()
// 添加折扣
calcPrice.add('70%', function (price) {return price *= 0.7})
// console.log(calcPrice(300,'70%'))
// 删除折扣
calcPrice.del('100-10')
// console.log(calcPrice(300,'100-10'))
从上述的例子中,很明显能总结出策略模式的优点
同时策略模式也有其缺点,但是并不影响我们对策略模式的使用