C++如何实现一个策略(Strategy)设计模式?(代码示例)


策略模式通过封装算法并动态切换实现行为解耦:定义抽象基类声明纯虚接口,具体策略类继承实现,上下文持策略指针运行时委托执行。

策略模式通过定义一系列算法,把它们一个个封装起来,并且使它们可以互相替换。C++中常用抽象基类声明策略接口,具体策略类继承并实现,上下文(Context)持有一个策略指针或引用,运行时动态切换行为。

定义策略接口(抽象基类)

用纯虚函数声明统一的操作契约,确保所有具体策略提供一致的调用方式:

class PaymentStrategy {
public:
    virtual ~PaymentStrategy() = default;
    virtual void pay(double amount) const = 0; // 纯虚函数,强制子类实现
};

实现多个具体策略

每个策略类独立封装一种算法逻辑,互不影响,便于新增或修改:

class CreditCardStrategy : public PaymentStrategy {
    std::string cardNumber;
    std::string expiryDate;
public:
    CreditCardStrategy(const std::string& number, const std::string& date)
        : cardNumber(number), expiryDate(date) {}
void pay(double amount) const override {
    std::cout << "Paid $" << amount << " via credit card: " 
              << cardNumber.substr(0, 4) << "****\n";
}

};

class PayPalStrategy : public PaymentStrategy { std::string email; public: PayPalStrategy(const std::string& e) : email(e) {}

void pay(double amount) const override {
    std::cout << "Paid $" << amount << " via PayPal: " << email << "\n";
}

};

创建上下文类管理策略

上下文不关心策略内部怎么实现,只负责持有和委托执行;支持运行时更换策略:

class ShoppingCart {
private:
    std::vector> items;
    std::unique_ptr strategy; // 智能指针管理生命周期

public: void addItem(const std::string& name, double price) { items.emplace_back(name, price); }

double getTotal() const {
    return std::accumulate(items.begin(), items.end(), 0.0,
        [](double sum, const auto& item) { return sum + item.second; });
}

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

void checkout() const {
    if (!strategy) {
        std::cout << "No payment strategy set.\n";
        return;
    }
    strategy->pay(getTotal());
}

};

使用示例(运行时切换策略)

客户端代码清晰解耦:策略选择与业务逻辑分离,易于测试和扩展:

int main() {
    ShoppingCart cart;
    cart.addItem("Laptop", 1200.0);
    cart.addItem("Mouse", 25.5);
// 切换为信用卡支付
cart.setPaymentStrategy(std::make_unique("1234567890123456", "12/25"));
cart.checkout(); // 输出:Paid $1225.5 via credit card: 1234****

// 切换为PayPal支付
cart.setPaymentStrategy(std::make_unique("user@example.com"));
cart.checkout(); // 输出:Paid $1225.5 via PayPal: user@example.com

return 0;

}


# ai  # c++  # red  # String  # 封装  # const  # 指针  # 继承  # 虚函数  # 纯虚函数  # 接口  # class  # public  # 委托  # 算法  # 多个  # 子类  # 使它  # 不关心  # 客户端  # 或引用  # amount  # void  # false 


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


相关推荐: 如何使用正则表达式提取以编号开头、后跟多个注解的完整代码块  如何使用Golang实现容器安全扫描_Golang Docker镜像漏洞检测方法  Win11 explorer.exe频繁崩溃_修复Win11资源管理器无限重启【步骤】  Win11怎么忘记WiFi网络_Win11删除已保存无线连接【教程】  Win11如何卸载OneDrive_Win11卸载OneDrive方法【教程】  C++中的constexpr和const有什么区别?(编译期常量)  如何在Golang中处理JSON字段缺失_Golangjson解析字段校验方法  Win11怎么关闭透明效果_Windows11个性化颜色关闭透明  php订单日志怎么记录评价_php记录订单评价日志方法【方法】  Windows10怎么查看系统激活状态_Windows10激活状态查看方法【教程】  mac本地php环境如何开启curl_curl扩展启用与测试步骤详解【汇总】  Win11怎样安装微信开发者工具_Win11安装开发者工具教程【步骤】  如何使用Golang反射将map转换为struct_Golang reflect类型映射技巧  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  Win11怎么设置任务栏大小_Windows11注册表修改TaskbarSi值  php嵌入式日志记录怎么实现_php将硬件数据写入本地日志文件【指南】  Win11怎么格式化U盘_Win11系统U盘格式化与文件系统选择【教程】  Win11开始菜单打不开_修复Windows 11点击开始图标无响应【教程】  如何在 VS Code 中正确配置并使用 NumPy  Win10怎么卸载迅雷_Win10彻底卸载迅雷方法【步骤】  Win11怎么更改盘符_Win11磁盘管理修改驱动器号【步骤】  Win11怎么设置屏保_Windows 11屏幕保护程序开启与设置【详解】  微信里的php文件怎么变mp4_微信接收php转mp4操作步骤【操作】  Python脚本参数接收_sys与argparse解析【指导】  Win11怎么更改电脑名称_Windows 11修改计算机名操作指南【步骤】  Windows10如何更改桌面背景_Win10个性化幻灯片放映设置  php下载安装后swoole扩展怎么安装_异步框架支持【汇总】  Python异步网络编程_aiohttp说明【指导】  Python项目回滚策略_发布安全说明【指导】  新手学PHP架构总混淆概念咋办_重点梳理【教程】  Windows10系统怎么查看硬盘健康_Win10 SMART信息检测工具  Win11怎么设置屏保时间_调整Win11屏幕保护等待时间【详解】  mac怎么查看wifi密码_MAC查看已连接WiFi密码方法【技巧】  PHP主流架构怎么监控运行状态_工具推荐【操作】  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  Mac如何创建和管理多个桌面空间_Mac高效多任务处理【技巧】  Win11怎么清理C盘系统日志_Win11清理系统日志文件【步骤】  Win10闹钟铃声怎么自定义 Win10闹钟自定义铃声教程【方法】  Windows蓝屏错误0x00000023怎么修复_FAT文件系统错误处理  如何使用Golang实现跨域请求支持_Golang CORS配置与处理方法  Win10 BitLocker加密教程 Win10给磁盘驱动器上锁【安全】  VSC怎么创建PHP项目_从零开始搭建项目的步骤【操作】  Win11怎么关闭SmartScreen_禁用Windows Defender筛选器教程【步骤】  Linux怎么实现内网穿透_Linux安装Frp客户端与服务端配置【方法】  TestNG的testng.xml配置文件怎么写  如何理解Go指针和内存分配关系_Go Pointer内存Model解析  Win11怎么设置默认输入法 Win11固定中文输入法【步骤】  php删除数据怎么软删除_添加is_del字段标记删除【技巧】  LINUX怎么设置系统语言_LINUX修改中文环境  Win10怎样设置多显示器_Win10多显示器扩展设置【攻略】 

 2025-12-31

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

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

点击免费数据支持

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