设计模式之策略模式学习
1.介绍
策略模式(Strategy Pattern)是一种行为型设计模式,用于在运行时选择算法的行为。它将一组可互换的算法封装在独立的类中,使它们可以相互替换,避免使用大量的条件语句。
🧱 结构组成
Strategy(策略接口):定义所有支持的算法的公共接口。
ConcreteStrategy(具体策略):实现策略接口的不同算法。
Context(上下文):维护一个对策略对象的引用,最终由它调用策略对象的方法。
2.例子
#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;
}
类图关系:
继承、组合。