JavaScript策略模式实战:动态管理折扣计算逻辑

作者:拾光

时间:2026-10-25

浏览:407

本文通过书店折扣计算案例,对比传统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中策略模式的实际应用案例,更多相关策略模式内容可参考本站历史文章或继续浏览后续内容,感谢大家的支持。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章