0

0

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

冰火之心

冰火之心

发布时间:2025-12-17 14:08:52

|

896人浏览过

|

来源于php中文网

原创

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

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

策略模式的核心思想

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

标准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);
    }
};

使用时可灵活切换:

XmxCms企业网站管理系统2.0
XmxCms企业网站管理系统2.0

原本这个程序只是本人两年前初学时练手的,最近拿出来进行了修改,所以叫XmxCms 企业网站管理系统2.0 开发环境:WinXP + VS2008 + SQLServer 2008 + Access开发语言:C#本程序采用 三层架构 + 抽象工厂设计模式 + Linq 实现,目前只做了Access 和 SQL Server ,默认数据库为Access,要更换数据库只需修改web.config 即可

下载

立即学习C++免费学习笔记(深入)”;

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
  • 上下文类可增加模板参数支持编译期策略绑定(静态策略),适用于性能敏感场景

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.11.27

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

153

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

103

2025.10.23

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1232

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

255

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2192

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.01.19

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

485

2023.08.04

全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

19

2026.02.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号