策略模式(Strategy Pattern)是C++中常用的行为型设计模式之一,它允许在运行时动态选择算法或行为。核心思想是将算法的实现与使用算法的类解耦,通过多态机制实现不同策略的自由切换。
策略模式包含三个主要角色:
下面是一个简单的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();
}
}};
策略模式适用于以下情况:
例如,在一个支付系统中,可以定义不同的支付策略:
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++11以后可以用更灵活的方式实现,比如使用std::function和lambda表达式:
#includeclass ContextModern {
private:
std::function
public:
void setStrategy(std::function
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
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。