c++如何实现策略模式 c++设计模式之Strategy【实例】


策略模式通过定义统一策略接口并由具体策略类实现,使上下文可在运行时动态切换算法,避免条件分支,提升扩展性与可维护性。

策略模式在C++中通过定义一组可互换的算法类,让它们实现统一接口,再由上下文(Context)在运行时动态选择具体策略。核心是“面向接口编程”,避免大量条件分支,提升扩展性和可维护性。

定义策略接口(Strategy)

使用纯虚函数声明算法行为,所有具体策略都继承并实现它:

// Strategy.h
class PaymentStrategy {
public:
    virtual ~PaymentStrategy() = default;
    virtual void pay(double amount) const = 0;
};

实现多个具体策略(ConcreteStrategy)

每个策略封装一种独立的支付逻辑,彼此解耦:

// AlipayStrategy.h
class AlipayStrategy : public PaymentStrategy {
public:
    void pay(double amount) const override {
        std::cout     }
};

// WechatPayStrategy.h
class WechatPayStrategy : public PaymentStrategy {
public:
    void pay(double amount) const override {
        std::cout     }
};

设计上下文(Context)持有并调用策略

Context不关心具体实现,只依赖Strategy接口;支持运行时切换策略:

// Order.h
class Order {
private:
    const PaymentStrategy* strategy_;
public:
    Order(const PaymentStrategy* s) : strategy_(s) {}
    void setStrategy(const PaymentStrategy* s) { strategy_ = s; }
    void checkout(double total) const {
        if (strategy_) strategy_->pay(total);
        else std::cout     }
};

客户端使用示例

策略对象可栈上创建、智能指针管理或工厂生成,灵活组合:

// main.cpp
int main() {
    AlipayStrategy alipay;
    WechatPayStrategy wechat;

    Order order(&alipay);
    order.checkout(199.9);  // 输出:支付宝支付 199.9 元

    order.setStrategy(&wechat);
    order.checkout(299.0);  // 输出:微信支付 299 元

    return 0;
}

策略模式让算法变化独立于使用它的逻辑,新增支付方式只需加一个类+一行注册,无需修改Order或其他已有代码。配合std::unique_ptr或策略工厂,还能进一步支持延迟创建和配置驱动。


# c++  # 封装  # const  # double  # void  # 继承  # 虚函数  # 纯虚函数  # 接口  # public  # default  # 算法  # 多个  # 还能  # 已有  # 只需  # 可在  # 或其他  # 并由  # 支付宝  # 支付方式  # 再由 


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


相关推荐: Mac电脑进水了怎么办_MacBook进水后紧急处理方法【必看】  Win10怎样卸载TeamViewer_Win10卸载TeamViewer步骤【教程】  Win11怎么忘记WiFi网络_Win11删除已保存无线连接【教程】  PythonPandas数据分析项目教程_时间序列透视表应用  php485在macos下怎么配置_php485 macOS系统配置指南【解答】  Win10怎么设置开机密码_Windows10账户登录密码设置与取消  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  php删除数据怎么加限制_带where条件删除避免全删【指南】  如何在JavaScript中动态拼接PHP的base_url与JS变量  Win10怎样卸载iTunes_Win10卸载iTunes步骤【步骤】  php转mp4怎么设置帧率_调整php生成mp4视频帧率说明【说明】  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  Windows 11无法安全删除U盘提示设备正在使用中怎么办_Windows 11找出占用设备进程  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  如何在Golang中优化文件读写性能_使用缓冲和并发处理  mac怎么打开终端_MAC终端Terminal使用入门与常用命令【教程】  Win11怎么设置环境变量_Win11配置Path路径变量【详解】  Win11麦克风没声音怎么设置_Win11麦克风权限及驱动修复【教程】  Win11怎么查看激活状态_查询Windows 11是否已永久激活【详解】  Python对象生命周期管理_创建销毁解析【教程】  如何在Golang中实现CI/CD流水线自动化测试_Golang持续集成测试执行方法  Windows10系统怎么查看防火墙状态_Win10安全中心网络保护  Linux如何申请SSL免费证书_Linux下Certbot安装与Nginx自动续期【指南】  Python函数参数高级用法_默认值与可变参数解析【教程】  windows如何备份注册表_windows导出和导入注册表文件教程  如何在Golang中编写异步函数测试_Golang异步操作测试策略  Python异步网络编程_aiohttp说明【指导】  Win11怎么更改默认打开方式_Win11关联文件格式教程【详解】  Win11如何更改任务栏颜色 Win11自定义任务栏背景色【美化】  本地php环境出现502错误_nginx或apache502badgateway解决技巧【解答】  Win10怎么更改用户名 Win10修改账户名称操作教程  Win11怎么关闭系统声音_Win11系统提示音静音设置【详解】  如何使用Golang实现RPC序列化与反序列化_Golang RPC数据编码与解码方法  windows 10应用商店区域怎么改_windows 10微软商店切换地区方法  如何在 IIS 上为 ASP.NET 6 应用排除特定目录并交由 PHP 处理  Win11怎么更改鼠标指针方案_Windows11自定义鼠标光标样式与大小  MAC怎么用连续互通相机里的“桌上视角”_MAC在视频通话中同时展示人脸和桌面  Mac怎么设置鼠标滚动速度_Mac鼠标设置详细参数  c++怎么调用nana库开发GUI_c++ 现代风格窗口组件与事件处理【实战】  Win10如何卸载微软拼音输入法 Win10只保留一个输入法【教程】  Go 中实现 Python urllib.quote() 功能的等效方法  Win10怎样卸载DockerDesktop_Win10卸载DockerDesktop步骤【步骤】  C++ STL算法库怎么用?C++常用算法函数(sort, find)教程【效率提升】  Mac系统更新下载慢或失败怎么办_解决macOS升级问题【方法】  Win10如何备份注册表_Win10注册表备份步骤【攻略】  Go 中 := 短变量声明的类型推导机制详解  C#如何在一个XML文件中查找并替换文本内容  C++如何获取CPU核心数?(std::thread::hardware_concurrency)  如何使用Golang recover捕获panic_防止程序崩溃并处理异常  PHP的FastAdmin架构适合二次开发吗_特点分析【介绍】 

 2025-12-30

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

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

点击免费数据支持

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