在C++项目里,策略模式常用于把容易变化的业务规则从主流程中抽离出来。它定义一个算法家族,分别封装起来,让它们之间可以互相替换,使算法的变化不会影响使用算法的客户。

什么是策略模式
策略模式包含三个核心角色:策略接口、具体策略类和上下文类。策略接口声明算法方法;具体策略实现不同算法;上下文持有策略对象并调用其方法。
怎样在C++中实现策略模式
1. 定义策略接口
使用纯虚函数定义统一的行为接口,具体策略在此基础上实现各自逻辑。
// 策略接口:计算折扣
class DiscountStrategy {
public:
virtual ~DiscountStrategy() = default;
virtual double calc(double price) const = 0;
};
2. 实现具体策略
每个具体策略对应一种算法,互相独立,方便增删。
// 无折扣策略
class NoDiscount : public DiscountStrategy {
public:
double calc(double price) const override {
return price;
}
};
// 满减折扣策略
class FullReduction : public DiscountStrategy {
public:
double calc(double price) const override {
if (price >= 100) return price - 20;
return price;
}
};
3. 上下文类使用策略
上下文不直接实现算法,而是委托给持有的策略对象,可在运行时更换。
class Order {
DiscountStrategy* strategy;
public:
Order(DiscountStrategy* s) : strategy(s) {}
void setStrategy(DiscountStrategy* s) {
strategy = s;
}
double finalPrice(double price) {
return strategy->calc(price);
}
};
4. 客户端调用示例
下面演示怎样在main函数中切换不同策略。
#include <iostream>
int main() {
NoDiscount nd;
FullReduction fr;
Order order(&nd);
std::cout << order.finalPrice(80) << std::endl;
order.setStrategy(&fr);
std::cout << order.finalPrice(120) << std::endl;
return 0;
}
使用策略模式的注意点
- 如果策略很多且差别小,可能产生类膨胀,可配合工厂模式管理。
- 在C++中注意策略对象的生命周期,避免悬空指针,可用智能指针替代原始指针。
- 当算法几乎不变时,不必强行使用策略模式,以免增加复杂度。
总结
在C++中使用策略模式,核心是通过抽象接口隔离变化,让上下文依赖抽象而非具体实现。合理运用能显著提升代码可维护性与扩展能力。