C++怎么实现策略设计模式_C++行为型模式与Strategy Pattern应用


策略模式(Strategy Pattern)是C++中常用的行为型设计模式之一,它允许在运行时动态选择算法或行为。核心思想是将算法的实现与使用算法的类解耦,通过多态机制实现不同策略的自由切换。

策略模式的基本结构

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

  • 策略接口(Strategy):定义所有支持算法的公共接口,通常是一个抽象基类或纯虚函数类。
  • 具体策略(Concrete Strategy):实现策略接口的具体类,每个类封装一种算法。
  • 上下文(Context):持有策略对象的引用或指针,调用策略接口执行算法,可在运行时更换策略。

下面是一个简单的C++实现示例:

// 策略接口 class Strategy { public: virtual ~Strategy() = default; virtual void execute() const = 0; };

// 具体策略A class ConcreteStrategyA : public Strategy { public: void execute() const override { std::cout

// 具体策略B class ConcreteStrategyB : public Strategy { public: void execute() const override { std::cout

// 上下文类 class Context { private: Strategy* strategy_;

public: explicit Context(Strategy* strategy) : strategy_(strategy) {}

void setStrategy(Strategy* strategy) {
    strategy_ = strategy;
}

void performAction() const {
    if (strategy_) {
        strategy_->execute();
    }
}

};

实际应用场景

策略模式适用于以下情况:

  • 有多个相似类,仅行为不同,比如排序、支付方式、日志记录方式等。
  • 需要在运行时动态切换算法,避免使用大量条件判断语句(如if-else或switch)。
  • 希望对用户隐藏算法细节,只暴露接口。

例如,在一个支付系统中,可以定义不同的支付策略:

class PaymentStrategy { public: virtual ~PaymentStrategy() = default; virtual void pay(int amount) const = 0; };

class CreditCardPayment : public PaymentStrategy { public: void pay(int amount) const override { std::cout

class AlipayPayment : public PaymentStrategy { public: void pay(int amount) const override { std::cout 支付宝支付: "

class ShoppingCart { private: PaymentStrategy strategy_; public: void setPaymentMethod(PaymentStrategy s) { strategy = s; } void checkout(int amount) { strategy->pay(amount); } };

这样,购物车无需关心具体支付方式,只需调用统一接口即可。

使用现代C++优化策略模式

传统策略模式依赖继承和指针,但C++11以后可以用更灵活的方式实现,比如使用std::function和lambda表达式:

#include #include iostream>

class ContextModern { private: std::function strategy_;

public: void setStrategy(std::function strategy) { strategy_ = strategy; }

void execute() const {
    if (strategy_) strategy_();
}

};

// 使用示例 ContextModern ctx; ctx.setStrategy([]{ std::cout

这种方式更加简洁,适合轻量级策略或临时逻辑,避免类膨胀。

基本上就这些。策略模式通过分离算法与使用逻辑,提升了代码的可维护性和扩展性,是C++中处理多态行为的有力工具。合理使用,能让程序更清晰、更灵活。


# c++  # 支付宝  # 工具  # mac  # ios  # switch  # stream  # red  # if  # 封装  # 多态  # include  # const  # int  # void  # Lambda  # 指针  # 继承  # 虚函数  # 纯虚函数  # 接口  # class  # public  # private  # function  # 对象  # default  # 算法  # 是一个  # 支付方式  # 更灵活  # 多个  # 可以用  # 只需  # 适用于  # 可在  # 能让 


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


相关推荐: 如何使用Golang反射创建map对象_动态生成键值映射  如何使用Golang构建简易投票统计功能_Golang投票数据汇总与展示示例  如何测试您的网站全球打开速度-网站海外测速工  如何解决Windows时间不准的问题?(自动同步设置)  Win11怎么查看激活状态_查询Windows 11是否已永久激活【详解】  如何在Golang中优化文件读写性能_使用缓冲和并发处理  Win10系统映像怎么恢复 Win10使用系统映像还原电脑【指南】  PHP接收参数值为空怎么办_判断和处理空参数方法说明【说明】  如何优化Golang内存分配与GC调度_Golang垃圾回收优化示例  windows 10专注助手怎么关闭_windows 10禁用通知提醒功能方法  c# await 一个已经完成的Task会发生什么  新手学PHP架构总混淆概念咋办_重点梳理【教程】  PythonWeb前后端整合项目教程_FastAPIReact完整实例  Mac的“调度中心”与“空间”怎么用_Mac多桌面高效管理【技巧】  如何在Golang中使用内置函数_Golanglen append make等使用技巧  Windows10电脑怎么设置防火墙出站规则_Win10禁止程序联网教程  Win11怎么更改任务栏位置_修改注册表将Win11任务栏置顶【教程】  c++如何获取map中所有的键_C++遍历键值对提取所有key的方法  Python装饰器设计思路_功能增强机制说明【指导】  Win11怎么关闭搜索历史_Win11清除设备上的搜索历史记录  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  php订单日志怎么导出excel_php导出订单日志到表格教程【教程】  Win11怎样安装微信开发者工具_Win11安装开发者工具教程【步骤】  如何在 Go 中可靠地测试含 time.Time 字段的结构体  如何使用Golang实现Web表单数据绑定_自动映射字段到结构体  Win11怎么更改盘符_Win11磁盘管理修改驱动器号【步骤】  跨文件调用类方法怎么用_php作用域操作符与自动加载配合【介绍】  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  php怎么下载安装后测试是否成功_简单脚本验证方法【操作】  Win11怎样安装搜狗输入法_Win11安装搜狗输入法教程【步骤】  如何在Golang中使用time处理时间_Golang time时间解析与格式化方法  c++中如何使用auto关键字_c++11类型推导用法说明  Win11快速助手怎么用_Win11远程协助连接教程【工具】  全球各国上班时间表外贸邮件时间  Win11无法拖拽文件到任务栏怎么办_Win11开启拖放功能修复【方法】  Windows任务计划服务异常原因_任务调度失败的处理方案  如何在 Go 中正确测试带 Cookie 的 HTTP 请求  Win11怎么设置默认PDF阅读器 Win11修改PDF打开方式【步骤】  Win11怎么关闭内容自适应亮度_Windows11显示设置CABC关闭  php中self::能调用子类重写的方法吗_静态绑定与重写关系【介绍】  Win11如何设置自动关机 Win11定时关机命令使用教程【技巧】  c++ try_emplace用法_c++ map高效插入数据  如何使用 Selenium 正确获取篮球参考网站球员名单元素列表  Python装饰器复用技巧_通用能力解析【教程】  Win11时间不对怎么同步_Win11自动校准互联网时间【设置】  Go 中 defer 语句在 goroutine 内部不返回时不会执行  如何使用Golang编写单元测试_创建Test函数验证业务逻辑  Windows音频驱动无声音原因解析_声卡驱动错误修复步骤  C#如何使用Channel C#通道实现异步通信  Win11怎么设置ipv4地址_Windows 11固定静态IP地址配置教程【详解】 

 2025-11-20

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

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

点击免费数据支持

提交您的需求,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.