如何用C++实现策略设计模式?C++行为型设计模式实战【代码架构】


策略模式将算法定义与使用分离,通过统一接口、具体实现类和上下文类实现运行时动态切换;如支付系统中微信、支付宝等策略均实现PaymentStrategy接口。

策略模式的核心思想

策略模式把算法的定义和使用分开,让不同算法可以互相替换,而不影响调用方代码。关键在于抽象出统一的策略接口,具体算法作为独立类实现,客户端通过组合方式持有策略对象,运行时动态切换。

标准C++策略模式结构

包含三个基本角色:策略接口(抽象基类)、多个具体策略类、上下文类(持有一个策略指针/引用,提供统一接口供外部调用)。

  • 策略接口用纯虚函数定义算法契约,不带实现
  • 具体策略类继承该接口,各自实现自己的算法逻辑
  • 上下文类不关心具体策略细节,只调用策略接口的函数
  • 策略对象通常通过构造函数或setter注入,支持运行时更换

一个实用的支付策略示例

假设电商系统需要支持微信、支付宝、银行卡三种支付方式,每种验证逻辑和扣款流程不同,但对外都提供“执行支付”能力。

// 策略接口
struct PaymentStrategy {
    virtual ~PaymentStrategy() = default;
    virtual bool pay(double amount) = 0;
};

// 微信支付策略
struct WechatPay : PaymentStrategy {
    bool pay(double amount) override {
        std::cout << "WeChat Pay: ¥" << amount << std::endl;
        return true;
    }
};

// 支付宝策略
struct Alipay : PaymentStrategy {
    bool pay(double amount) override {
        std::cout << "Alipay: ¥" << amount << std::endl;
        return true;
    }
};

// 上下文类
struct OrderProcessor {
    std::unique_ptr strategy;

    explicit OrderProcessor(std::unique_ptr s) 
        : strategy(std::move(s)) {}

    void setStrategy(std::unique_ptr s) {
        strategy = std::move(s);
    }

    bool executePayment(double amount) {
        if (!strategy) return false;
        return strategy->pay(amount);
    }
};

使用时可灵活切换:

OrderProcessor processor = OrderProcessor(std::make_unique());
processor.executePayment(99.9); // 输出微信支付

processor.setStrategy(std::make_unique());
processor.executePayment(128.5); // 输出支付宝

进阶技巧与注意事项

实际项目中建议结合现代C++特性提升健壮性和灵活性:

  • std::unique_ptr管理策略生命周期,避免裸指针和内存泄漏
  • 策略接口析构函数必须为virtual,确保多态销毁安全
  • 若策略无需状态,可考虑用std::function替代类层次,更轻量(如std::function
  • 上下文类可增加模板参数支持编译期策略绑定(静态策略),适用于性能敏感场景

基本上就这些。策略模式不复杂但容易忽略接口职责边界——只要策略之间互不影响、算法可替换,就是它该出场的时候。


# 支付宝  # 微信  # 微信支付  # c++  # 架构  # 多态  # 构造函数  # 析构函数  # bool  # double  # 指针  # 继承  # 虚函数  # 纯虚函数  # 接口  # function  # 对象  # 算法  # 自己的  # 进阶  # 多个  # 适用于  # 而不  # 三种  # 不带  # 绑定  # 关键在于 


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


相关推荐: c++20的std::format怎么用 比printf更安全高效的格式化方法【详解】  php后缀怎么变mp4能播放_让php伪装mp4正常播放的技巧【技巧】  Win11如何隐藏桌面图标 Win11一键隐藏/显示桌面图标【指南】  Win11怎么查看局域网电脑_Windows 11网络邻居发现设置【技巧】  如何诊断并终止卡死的 multiprocessing 子进程  PHP 中如何在函数内持久修改引用变量所指向的目标  微信JSAPI支付回调PHP怎么接收_处理JSAPI异步通知数据方法【指南】  c++怎么操作redis数据库_c++ hiredis库连接与命令执行【实战】  php485返回空数组怎么回事_php485数据接收为空排查指南【详解】  Python爬虫项目实战教程_Scrapy抓取与存储数据实例  Python配置文件操作教程_JSONINIYAML解析与应用实战  Win11如何设置计划任务 Win11定时执行程序教程【详解】  Python代码测试策略_质量保障解析【教程】  Mac的访达(Finder)怎么用_Mac文件管理入门教程【详解】  Win11怎么用设置清理回收站_Win11设置清理回收站技巧【步骤】  Win11怎么关闭系统提示音_Windows11声音方案设为无声教程  Win10怎么关闭自动更新错误重启 Win10策略禁止失败补丁强制重启【防护】  Win11怎么查看wifi信号强度_检测Windows 11无线网络质量方法【详解】  Windows10无法识别USB设备描述符请求失败_通用串行总线控制器修复  Go 中实现 Python urllib.quote() 功能的等效方法  mac怎么安装adb_MAC配置Android ADB开发环境【详解】  c++ stringstream用法详解_c++字符串与数字转换利器  Golang如何实现基本的用户注册_Golang用户注册表单处理示例  Python装饰器复用技巧_通用能力解析【教程】  Win11如何暂停系统更新 Win11暂停更新最长时限设置【步骤】  Win11怎么查看硬盘型号_Windows 11检测硬盘信息方法【技巧】  Go 中 := 短变量声明的类型推导机制详解  Win11怎么清理C盘虚拟内存_Win11清理虚拟内存设置【教程】  php查询数据怎么分组_groupby分组查询配合聚合函数【技巧】  mac怎么右键_MAC鼠标右键设置与触控板手势技巧【入门】  Win11怎么更改鼠标指针方案_Windows11自定义鼠标光标样式与大小  Win11任务栏颜色怎么改_Win11自定义任务栏配色设置【美化】  Win11怎么设置组合键快捷方式_Windows11自定义快捷键操作  如何优化Golang内存分配与GC调度_Golang垃圾回收优化示例  如何在 Go 中调用动态链接库(.so)中的函数  Linux如何安装JDK11_Linux环境变量配置与Java开发环境搭建【教程】  如何使用Golang实现路由参数绑定_使用Mux和Request解析路径变量  mac怎么安装字体_MAC添加第三方字体与字体册管理【教程】  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  Win11怎样安装网易云音乐_Win11安装网易云教程【步骤】  如何使用Golang实现负载均衡_分发请求到多个服务节点  Mac如何备份到iCloud_Mac桌面与文稿文件夹云同步【设置】  如何在 ACF 中正确更新嵌套多层 Group 字段内的子字段  php和redis连接超时怎么办_phpredis调试连接问题汇总【指南】  如何开启Windows的远程服务器管理工具(RSAT)?(管理服务器)  Win11 C盘满了怎么清理 Win11磁盘清理和存储感知使用教程【新手必看】  Mac如何解压zip和rar文件?(推荐免费工具)  Windows10怎么查看系统激活状态_Windows10激活状态查看方法【教程】  Laravel 查询 JSON 列:高效筛选包含数组中任意值的记录  如何在 Go 应用中实现自动错误恢复与进程重启机制 

 2025-12-17

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

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

点击免费数据支持

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