策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时根据不同的情况选择算法的行为。这意味着可以定义一系列算法,并能够在运行时根据需要动态切换使用的算法,而不需要更改使用算法的客户端代码。
策略模式在现实生活中的例子包括支付方式的选择(现金、信用卡、支付宝等),排序算法的选择(冒泡排序、快速排序、归并排序等)等
在策略模式中,通常包含以下角色:
-
环境(Context):持有一个策略对象的引用,并在需要时将请求委派给策略对象执行。
-
抽象策略(Strategy):定义了一个公共的接口或抽象类,用于封装不同的算法或策略。
-
具体策略(Concrete Strategy):实现了抽象策略定义的接口或抽象类,提供了具体的算法实现。
使用策略模式的好处是可以将算法的实现与使用算法的代码解耦,使得它们可以独立变化。当需要新增或修改算法时,只需要添加或修改相应的策略类,而不需要修改客户端的代码。
1 // 定义抽象策略类 2 class SortStrategy { 3 public: 4 virtual void sort(std::vector<int>& data) = 0; 5 }; 6 7 // 具体策略类1:快速排序 8 class QuickSortStrategy : public SortStrategy { 9 public: 10 void sort(std::vector<int>& data) override { 11 std::cout << "Using QuickSort" << std::endl; 12 // 实现快速排序算法 13 } 14 }; 15 16 // 具体策略类2:归并排序 17 class MergeSortStrategy : public SortStrategy { 18 public: 19 void sort(std::vector<int>& data) override { 20 std::cout << "Using MergeSort" << std::endl; 21 // 实现归并排序算法 22 } 23 }; 24 25 // 环境类 26 class SortContext { 27 private: 28 SortStrategy* strategy; 29 30 public: 31 SortContext(SortStrategy* strategy) : strategy(strategy) {} 32 33 void setStrategy(SortStrategy* strategy) { 34 this->strategy = strategy; 35 } 36 37 void sortData(std::vector<int>& data) { 38 strategy->sort(data); 39 } 40 }; 41 42 int main() { 43 std::vector<int> data = {5, 2, 8, 1, 9}; 44 45 // 创建具体策略对象 46 SortStrategy* quickSort = new QuickSortStrategy(); 47 SortStrategy* mergeSort = new MergeSortStrategy(); 48 49 // 创建环境对象并设置策略 50 SortContext context(quickSort); 51 context.sortData(data); // 使用快速排序 52 53 context.setStrategy(mergeSort); 54 context.sortData(data); // 使用归并排序 55 56 // 释放内存 57 delete quickSort; 58 delete mergeSort; 59 60 return 0; 61 }