C++怎么实现一个策略模式_C++设计模式与策略模式实现


策略模式通过封装不同算法并使其可互换,提升代码灵活性;示例中Sorter上下文调用不同排序策略,体现多态与开闭原则。

策略模式是一种行为型设计模式,它让你定义一系列算法或行为,并将每种行为封装在独立的类中,使它们可以互换使用。在C++中实现策略模式,关键在于通过基类指针调用派生类的虚函数,从而实现运行时多态。

策略模式的核心结构

策略模式包含三个主要角色:

  • Strategy(策略接口): 定义所有支持算法的公共接口,通常是一个抽象基类,含有一个纯虚函数。
  • ConcreteStrategy(具体策略): 实现Strategy接口的具体类,每个类代表一种算法。
  • Context(上下文): 持有一个Strategy对象的引用或指针,客户端通过Context来使用具体的策略。

一个简单的C++实现示例

假设我们要实现不同的排序策略(如冒泡排序、快速排序),可以这样设计:

// 策略接口 class SortStrategy { public: virtual ~SortStrategy() = default; virtual void sort(std::vector& data) const = 0; };

// 具体策略:冒泡排序 class BubbleSort : public SortStrategy { public: void sort(std::vector& data) const override { for (size_t i = 0; i data[j+1]) std::swap(data[j], data[j+1]); } };

// 具体策略:快速排序 class QuickSort : public SortStrategy { public: void sort(std::vector& data) const override { quickSortImpl(data, 0, data.size() - 1); }

private: void quickSortImpl(std::vector& arr, int low, int high) const { if (low

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

};

// 上下文类 class Sorter { private: const SortStrategy* strategy;

public: explicit Sorter(const SortStrategy* strat = nullptr) : strategy(strat) {}

void setStrategy(const SortStrategy* strat) {
    strategy = strat;
}

void performSort(std::vector& data) const {
    if (strategy)
        strategy->sort(data);
}

};

如何使用这个策略模式

客户端代码可以根据需要动态切换排序算法:

int main() { std::vector data = {64, 34, 25, 12, 22, 11, 90};
Sorter sorter;

// 使用冒泡排序
BubbleSort bubble;
sorter.setStrategy(&bubble);
sorter.performSort(data);
// 此时 data 已排序

// 切换为快速排序
QuickSort quick;
sorter.setStrategy(&quick);
sorter.performSort(data);

return 0;

}

这种设计让算法的变化独立于使用它的客户端,符合开闭原则——对扩展开放,对修改关闭。

优点与适用场景

策略模式的优势包括:

  • 避免使用大量的条件语句(如if-else或switch)选择算法。
  • 算法可以独立于使用它的类进行变化和扩展。
  • 便于单元测试,每个策略可以单独测试。

常见应用场景有:不同支付方式、多种数据压缩算法、渲染策略、路径规划等。

基本上就这些。只要理解了多态和接口抽象,C++中的策略模式实现并不复杂,但能显著提升代码的灵活性和可维护性。


# ai  # c++  # switch  # 排序算法  # 冒泡排序  # if  # sort  # for  # 封装  # 多态  # const  # 快速排序  # int  # void  # 指针  # 虚函数  # 纯虚函数  # 接口  # class  # public  # private  # 对象  # default  # 算法  # 客户端  # 是一个  # 开闭  # 是一种  # 让你  # 并将  # 使其  # 可以根据  # 使它 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: Win11输入法选字框不见了怎么办_Win11输入法修复与重置【教程】  Windows 11如何查看系统激活密钥_Windows 11使用CMD或PowerShell命令找回Product Key  Windows怎样关闭开始菜单广告_Windows关闭开始菜单广告设置【步骤】  作用域操作符会影响性能吗_php静态调用性能分析【教程】  Windows任务计划服务异常原因_任务调度失败的处理方案  php下载安装选zip还是msi格式_两种安装包对比【教程】  Python对象比较与排序_魔术方法解析【教程】  c++ nullptr与NULL区别_c++11空指针规范  c++的static关键字有什么用 静态变量和静态函数的应用场景【教程】  Win11玩游戏全屏闪退怎么办_Win11全屏优化禁用设置【教程】  Python网络日志追踪_请求定位解析【教程】  Python文件管理规范_工程实践说明【指导】  Windows10如何更改盘符名称_Win10重命名硬盘分区卷标  如何在Golang中处理JSON字段缺失_Golangjson解析字段校验方法  如何使用Golang实现路由参数绑定_使用Mux和Request解析路径变量  Windows10怎样设置家长控制_Windows10家长控制设置方法【指南】  Python多线程使用规范_线程安全解析【教程】  Win11怎么清理C盘下载文件夹_Win11清理下载文件夹技巧【教程】  Win11蓝牙开关不见了怎么办_Win11蓝牙驱动丢失修复教程【方法】  c++如何使用std::bitset进行位图算法_c++ 快速查找与大规模数据排重【方法】  如何使用Golang table-driven fuzz测试_多数据随机化发现缺陷  Win11怎么清理C盘系统日志_Win11清理系统日志文件【步骤】  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  如何开启Windows的远程服务器管理工具(RSAT)?(管理服务器)  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  Win11怎么设置多显示器任务栏 Win11扩展任务栏至多屏方便跨屏操作【技巧】  Win11怎么设置开机问候语_自定义Win11锁屏提示信息【技巧】  MAC如何安装Git版本控制工具_MAC开发环境配置与Xcode插件安装【教程】  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  Python音视频处理高级项目教程_FFmpegPydub剪辑与特效  Win10如何卸载WindowsDefender_Win10卸载Defender教程【方法】  php后缀怎么变mp4能播放_让php伪装mp4正常播放的技巧【技巧】  如何在包含多值的列中精准搜索指定演员?  Win11怎么设置任务栏对齐方式_Windows11个性化任务栏行为  如何在Golang中使用log包输出不同级别日志_Golang log日志管理与分类  如何在Golang中处理通道发送接收错误_防止阻塞或panic  Win11怎么更改默认打开方式_Win11关联文件格式教程【详解】  Win10怎样设置多显示器_Win10多显示器扩展设置【攻略】  VSC怎么配置PHP的Xdebug_远程调试设置步骤【详解】  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  Win11怎样安装搜狗输入法_Win11安装搜狗输入法教程【步骤】  Win11怎么关闭内容自适应亮度_Windows11显示设置CABC关闭  Win11如何更改用户账户文件夹名称 Win11修改C:Users用户名【终极教程】  Linux怎么实现内网穿透_Linux安装Frp客户端与服务端配置【方法】  Python lxml的etree和ElementTree有什么区别  Win10怎么卸载金山毒霸_Win10彻底卸载金山毒霸方法【步骤】  mac怎么安装字体_MAC添加第三方字体与字体册管理【教程】  Windows10系统怎么查看运行时间_Win10 CPU正常运行时间查询  PythonWeb前后端整合项目教程_FastAPIReact完整实例  MAC怎么使用表情符号面板_MAC Emoji快捷键调用与符号查找【方法】 

 2025-11-10

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.