策略模式将算法定义与使用分离,通过统一接口、具体实现类和上下文类实现运行时动态切换;如支付系统中微信、支付宝等策略均实现PaymentStrategy接口。
策略模式把算法的定义和使用分开,让不同算法可以互相替换,而不影响调用方代码。关键在于抽象出统一的策略接口,具体算法作为独立类实现,客户端通过组合方式持有策略对象,运行时动态切换。
包含三个基本角色:策略接口(抽象基类)、多个具体策略类、上下文类(持有一个策略指针/引用,提供统一接口供外部调用)。
假设电商系统需要支持微信、支付宝、银行卡三种支付方式,每种验证逻辑和扣款流程不同,但对外都提供“执行支付”能力。
// 策略接口
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 amoun
t) 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::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
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。