1.介绍
策略模式(Strategy Pattern )是一种行为型设计模式 ,用于在运行时选择算法的行为。它将一组可互换的算法封装在独立的类中,使它们可以相互替换,避免使用大量的条件语句。
🧱 结构组成
-
Strategy(策略接口):定义所有支持的算法的公共接口。
-
ConcreteStrategy(具体策略):实现策略接口的不同算法。
-
Context(上下文):维护一个对策略对象的引用,最终由它调用策略对象的方法。
2.例子
cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <memory>
// 策略接口
class SortStrategy {
public:
virtual void sort(std::vector<int>& data) = 0;
virtual ~SortStrategy() = default;
};
// 具体策略:升序排序
class AscendingSort : public SortStrategy {
public:
void sort(std::vector<int>& data) override {
std::sort(data.begin(), data.end());
}
};
// 具体策略:降序排序
class DescendingSort : public SortStrategy {
public:
void sort(std::vector<int>& data) override {
std::sort(data.begin(), data.end(), std::greater<int>());
}
};
// 上下文:持有一个策略对象
class Context {
private:
std::unique_ptr<SortStrategy> strategy;
public:
void setStrategy(std::unique_ptr<SortStrategy> s) {
strategy = std::move(s);
}
void doSort(std::vector<int>& data) {
if (strategy) {
strategy->sort(data);
} else {
std::cerr << "No strategy set!" << std::endl;
}
}
};
// 测试代码
int main() {
Context context;
std::vector<int> data = {5, 2, 8, 1, 3};
std::cout << "Original: ";
for (int i : data) std::cout << i << " ";
std::cout << "\n";
// 使用升序排序
context.setStrategy(std::make_unique<AscendingSort>());
context.doSort(data);
std::cout << "Ascending: ";
for (int i : data) std::cout << i << " ";
std::cout << "\n";
// 使用降序排序
context.setStrategy(std::make_unique<DescendingSort>());
context.doSort(data);
std::cout << "Descending: ";
for (int i : data) std::cout << i << " ";
std::cout << "\n";
return 0;
}
类图关系:

继承、组合。