1. 策略模式在C++中的核心价值
策略模式(Strategy Pattern)是我在多年C++开发中最常使用的设计模式之一。它本质上定义了一系列算法族,将每个算法封装起来,并使它们可以互相替换。这种模式让算法的变化独立于使用算法的客户。
想象你正在开发一个游戏角色系统。角色有多种攻击方式:普通攻击、魔法攻击、暴击攻击。新手程序员可能会写出这样的代码:
cpp复制class Character {
public:
void attack() {
if (attackType == NORMAL) {
// 普通攻击逻辑
} else if (attackType == MAGIC) {
// 魔法攻击逻辑
} else if (attackType == CRITICAL) {
// 暴击攻击逻辑
}
}
private:
AttackType attackType;
};
这种写法存在几个明显问题:
- 违反开闭原则 - 新增攻击类型需要修改Character类
- 条件判断臃肿 - 随着攻击类型增加,if-else会越来越长
- 难以单元测试 - 各种攻击逻辑耦合在一起
策略模式通过将攻击行为抽象为接口,完美解决了这些问题。在C++中,我们可以这样实现:
cpp复制class AttackStrategy {
public:
virtual ~AttackStrategy() = default;
virtual void execute() = 0;
};
class NormalAttack : public AttackStrategy {
public:
void execute() override { /* 普通攻击实现 */ }
};
class Character {
public:
void setAttackStrategy(std::unique_ptr<AttackStrategy> strategy) {
attackStrategy = std::move(strategy);
}
void attack() {
if (attackStrategy) {
attackStrategy->execute();
}
}
private:
std::unique_ptr<AttackStrategy> attackStrategy;
};
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. C++策略模式的典型实现方式
2.1 基于虚函数的经典实现
这是最传统的策略模式实现方式,也是大多数C++教材中介绍的方法。我们通过抽象基类定义策略接口,具体策略类继承并实现该接口。
cpp复制// 策略接口
class SortingStrategy {
public:
virtual ~SortingStrategy() = default;
virtual void sort(std::vector<int>& data) = 0;
};
// 具体策略
class QuickSort : public SortingStrategy {
public:
void sort(std::vector<int>& data) override {
// 快速排序实现
std::cout << "Sorting using QuickSort" << std::endl;
}
};
class MergeSort : public SortingStrategy {
public:
void sort(std::vector<int>& data) override {
// 归并排序实现
std::cout << "Sorting using MergeSort" << std::endl;
}
};
// 上下文类
class Sorter {
public:
void setStrategy(std::unique_ptr<SortingStrategy> strategy) {
strategy_ = std::move(strategy);
}
void executeSort(std::vector<int>& data) {
if (strategy_) {
strategy_->sort(data);
}
}
private:
std::unique_ptr<SortingStrategy> strategy_;
};
使用示例:
cpp复制std::vector<int> data = {5, 2, 8, 1, 9};
Sorter sorter;
sorter.setStrategy(std::make_unique<QuickSort>());
sorter.executeSort(data); // 使用快速排序
sorter.setStrategy(std::make_unique<MergeSort>());
sorter.executeSort(data); // 切换为归并排序
2.2 基于函数指针的实现
对于简单策略,C++可以直接使用函数指针,避免虚函数开销:
cpp复制using SortingFunction = void (*)(std::vector<int>&);
void quickSort(std::vector<in
