C++ 策略模式

策略模式概述

策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。它将算法封装在独立的类中,使得它们可以互相替换,而不影响使用算法的客户端代码。

策略模式结构

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

  • Context:维护一个对策略对象的引用,通过接口与策略对象交互。
  • Strategy:定义所有支持的算法的公共接口。
  • ConcreteStrategy:实现具体算法的类。

实现示例

以下是一个简单的C++实现示例,展示如何使用策略模式实现不同的排序算法:

cpp 复制代码
#include <iostream>
#include <vector>

// Strategy接口
class SortStrategy {
public:
    virtual void sort(std::vector<int>& data) = 0;
    virtual ~SortStrategy() = default;
};

// ConcreteStrategy: 冒泡排序
class BubbleSort : public SortStrategy {
public:
    void sort(std::vector<int>& data) override {
        std::cout << "Sorting using Bubble Sort" << std::endl;
        // 实现冒泡排序逻辑
        for (size_t i = 0; i < data.size(); ++i) {
            for (size_t j = 0; j < data.size() - i - 1; ++j) {
                if (data[j] > data[j + 1]) {
                    std::swap(data[j], data[j + 1]);
                }
            }
        }
    }
};

// ConcreteStrategy: 快速排序
class QuickSort : public SortStrategy {
public:
    void sort(std::vector<int>& data) override {
        std::cout << "Sorting using Quick Sort" << std::endl;
        // 实现快速排序逻辑
        quickSort(data, 0, data.size() - 1);
    }

private:
    void quickSort(std::vector<int>& data, int low, int high) {
        if (low < high) {
            int pivot = partition(data, low, high);
            quickSort(data, low, pivot - 1);
            quickSort(data, pivot + 1, high);
        }
    }

    int partition(std::vector<int>& data, int low, int high) {
        int pivot = data[high];
        int i = low - 1;
        for (int j = low; j < high; ++j) {
            if (data[j] < pivot) {
                ++i;
                std::swap(data[i], data[j]);
            }
        }
        std::swap(data[i + 1], data[high]);
        return i + 1;
    }
};

// Context类
class Sorter {
private:
    SortStrategy* strategy;

public:
    Sorter(SortStrategy* strategy) : strategy(strategy) {}

    void setStrategy(SortStrategy* newStrategy) {
        strategy = newStrategy;
    }

    void sort(std::vector<int>& data) {
        strategy->sort(data);
    }
};

// 客户端代码
int main() {
    std::vector<int> data = {5, 2, 9, 1, 5, 6};

    BubbleSort bubbleSort;
    QuickSort quickSort;

    Sorter sorter(&bubbleSort);
    sorter.sort(data);

    // 输出排序结果
    for (int num : data) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    // 切换策略
    sorter.setStrategy(&quickSort);
    sorter.sort(data);

    // 输出排序结果
    for (int num : data) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

策略模式优点

  • 算法可以自由切换,只需修改策略对象即可。
  • 避免使用多重条件判断语句,提高代码可维护性。
  • 扩展性好,增加新策略只需添加新的策略类,无需修改现有代码。

策略模式适用场景

  • 一个系统需要动态地在几种算法中选择一种。
  • 有多个条件语句的类,每个分支对应不同的算法行为。
  • 需要封装算法,使得算法可以独立于使用它的客户端变化。

注意事项

  • 客户端必须了解所有策略类的区别,以便选择合适的策略。
  • 策略模式会增加系统中对象的数量,可以通过共享策略对象来减少开销。
相关推荐
老木避暑研究所4 分钟前
从原始数据到洞察:一次完整的避暑房环境数据采集、清洗与可视化分析
java·开发语言
程序喵大人18 分钟前
【C++入门】编译链接模型 - 05 ODR 为什么会让重复定义变成工程炸点
开发语言·c++·编译链接·odr
weixin1997010801627 分钟前
《淘宝TOP API:落地方案、接口边界与业务踩坑 —— 聚石塔内外价差 10 倍的真相》(附 Python 源码)
开发语言·python
前端 贾公子29 分钟前
LangGraph == 图的状态(State)管理 (上)
java·开发语言·数据库
汉克老师1 小时前
CSP-S 2026 初赛试题解析(第一部分:选择题(8-15))精讲
c++·csp-s·小学生·学c++编程
_wyt0011 小时前
洛谷 P10112 [GESP202312 八级] 奖品分配 题解
c++·数学·gesp·八级
xuxigifxfh1 小时前
牛客:HJ170 01序列
java·开发语言·算法·华为机考
朝朝辞暮i1 小时前
C++ 第 33 课:事件循环——spin() 到底在干什么
开发语言·c++·算法
野生技术架构师2 小时前
牛客网互联网大厂 Java 高频面试题整理(持续更新)
java·开发语言
殷色玫瑰2 小时前
AVL树:从平衡因子到四种旋转的完整实现
c语言·数据结构·c++·算法·visualstudio