1. 策略模式实战:超市优惠系统的灵活设计
作为一名长期奋战在零售系统开发一线的工程师,我深知优惠活动模块的复杂性。每次市场部门推出新活动,开发团队就要加班加点修改代码,稍有不慎就会引发线上故障。今天我要分享的这套基于策略模式的优惠系统设计方案,已经在我们团队稳定运行三年,成功支持了超过20种不同类型的促销活动。
1.1 为什么传统if-else方案行不通
在早期版本中,我们的优惠计算是这样的:
cpp复制float calculateDiscount(float price, int type) {
if (type == 1) { // 九折
return price * 0.9;
} else if (type == 2) { // 满100减10
if (price >= 100) return price - 10;
} else if (type == 3) { // 第二件半价
// 复杂逻辑...
}
// 更多else if...
}
这种写法存在三个致命问题:
- 维护成本高:每次新增优惠类型都要修改核心函数,违反开闭原则
- 可读性差:当优惠类型超过5种后,代码变成难以理解的"面条式"结构
- 测试困难:修改一个优惠逻辑可能意外影响其他优惠的计算
1.2 策略模式的救赎
策略模式通过将每种优惠算法封装成独立类,完美解决了上述问题。它的核心思想可以用餐厅点餐来类比:
- 顾客(客户端)只需要决定吃什么(选择策略)
- 厨房(策略类)负责具体烹饪(算法实现)
- 服务员(上下文类)协调整个过程
这种架构下,新增菜式(优惠类型)只需增加新厨师(策略类),完全不影响现有流程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统设计与实现细节
2.1 UML架构解析

这个设计包含三个关键组件:
- DiscountStrategy(抽象策略):定义所有优惠策略必须实现的
applyDiscount接口 - 具体策略类:实现各种优惠算法,如
NineDiscount、FullReduceDiscount - DiscountContext(上下文):维护策略引用,提供统一的调用接口
2.2 核心代码实现
2.2.1 基础策略接口
cpp复制class DiscountStrategy {
public:
virtual int applyDiscount(int originalPrice) = 0;
virtual ~DiscountStrategy() = default;
// 新增策略元信息接口
virtual string getStrategyName() const = 0;
virtual string getDescription() const = 0;
};
我特别添加了策略描述接口,这在后期动态展示优惠
