策略模式

策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时根据不同的情况选择算法的行为。这意味着可以定义一系列算法,并能够在运行时根据需要动态切换使用的算法,而不需要更改使用算法的客户端代码。

策略模式在现实生活中的例子包括支付方式的选择(现金、信用卡、支付宝等),排序算法的选择(冒泡排序、快速排序、归并排序等)等

在策略模式中,通常包含以下角色:

  1. 环境(Context):持有一个策略对象的引用,并在需要时将请求委派给策略对象执行。

  2. 抽象策略(Strategy):定义了一个公共的接口或抽象类,用于封装不同的算法或策略。

  3. 具体策略(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 }

 

posted @ 2023-08-08 17:23  纳姆德隆  阅读(44)  评论(0编辑  收藏  举报