新闻中心

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

2025-11-10
浏览次数:
返回列表
策略模式通过封装不同算法并使其可互换,提升代码灵活性;示例中Sorter上下文调用不同排序策略,体现多态与开闭原则。

c++怎么实现一个策略模式_c++设计模式与策略模式实现

策略模式是一种行为型设计模式,它让你定义一系列算法或行为,并将每种行为封装在独立的类中,使它们可以互换使用。在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<int>& 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<int>& data) const {
    if (strategy)
        strategy->sort(data);
}

};

如何使用这个策略模式

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

奥硕企业网站管理系统1.9 Sql版 奥硕企业网站管理系统1.9 Sql版

临沂奥硕软件有限公司拥有国内一流的企业网站管理系统,奥硕企业网站管理系统真正会打字就会建站的管理系统,其强大的扩展性可以满足企业网站实现各种功能。奥硕企业网站管理系统具有一下特色功能1、双语双模(中英文采用单独模板设计,可制作中英文不同样式的网站)2、在线编辑JS动态菜单支持下拉效果,同时生成中文,英文,静态3个JS菜单3、在线制作并调用FLASH展示动画4、自动生成缩略图,可以自由设置宽高5、图

奥硕企业网站管理系统1.9 Sql版 0 查看详情 奥硕企业网站管理系统1.9 Sql版 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++中的策略模式实现并不复杂,但能显著提升代码的灵活性和可维护性。

以上就是C++怎么实现一个策略模式_C++设计模式与策略模式实现的详细内容,更多请关注其它相关文章!


# 临沂  # 本溪网站优化哪家做得好  # 乌鲁木齐绍兴网站建设  # 深圳设计公司网站建设  # 宜昌seo排名优化  # 食府营销推广策略分析  # 马克斯seo模板  # 青岛营销推广设计招聘网  # 青岛装饰设计网站建设  # 荆州seo优化软件  # 网站建设怎么找  # 开闭  # 就会  # ai  # 边缘  # 是一个  # 客户端  # 多态  # 游戏开发  # 企业网站  # 管理系统  # 冒泡排序  # 排序算法  # switch  # c++ 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程  TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法  PostgreSQL海量数据高效导入策略:Python与Django实践指南  将HTML Canvas内容转换为可上传的图像文件(File对象)  怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  格力空气能E5故障代码是什么情况_格力空气能E5代码解析与应对措施  html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】  解决Rails应用中内容错位与Turbo警告:meta标签误用导致富文本渲染异常  品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程  Node.js中HTML按钮与J*aScript函数交互的正确姿势  在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明  汽水音乐在线解析 汽水音乐在线解析入口  QQ官网正版登录链接 QQ在线登录入口最新  J*a TimerTask中HashMap意外清空的深层原因与解决方案  zookeeper 都有哪些功能?  必由学在线入口 必由学网页版快速登录入口  零跑汽车11月交付量达70327台 实现连续9个月正增长  Win11网速慢怎么解决 Win11网络设置优化解除限速  淘宝支付提示失败如何解决 淘宝支付流程优化方法  如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题  解决深度学习模型训练初期异常高损失与完美验证准确率问题  React Router v6 教程:构建认证保护的私有路由与重定向策略  qq邮箱日历功能怎么用_创建日程与会议邀请的技巧  马斯克:Optimus 人形机器人复数形式为 Optimi  Gmail邮箱申请注册直达_Gmail邮箱免费注册PC版官网入口2025  新手怎么开始学化妆 零基础化妆入门教程  如何将HTML表格多行数据保存到Google Sheet  护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?  SteamMachine定价或为699美元 大家想入手吗?  Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达  PHP 枚举:根据字符串获取枚举案例的策略与实现  动漫岛观看全网网 动漫岛在线正版动漫入口  TikTok网页版直接登录 TikTok网页端官方平台入口  百度网盘网页版入口 百度网盘网页版官方登录网址  铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则  俄罗斯Yandex搜索引擎入口_Yandex官网免登录一键访问  邮政编码查询不到怎么办_邮政编码查询不到的常见原因与对策  Python大型XML文件高效流式解析教程  拼多多购物车商品数量无法修改如何处理 拼多多购物车操作优化方法  深入理解J*aScript Promise异步执行与微任务队列  J*aScript异步迭代器_j*ascript异步遍历  J*aScript中高效管理与清空动态列表:避免循环陷阱  html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】  响应式图片在网页设计中的正确实现方法  冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法  谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问  汽水音乐在线版入口_汽水音乐网页播放手册  解决Python logging 中 datefmt 导致时间戳固定不变的问题  AI泡沫首次被“刺破”:GPU十年都无法存活! 

搜索