策略模式通过定义统一策略接口并由具体策略类实现,使上下文可在运行时动态切换算法,避免条件分支,提升扩展性与可维护性。
策略模式在C++中通过定义一组可互换的算法类,让它们实现统一接口,再由上下文(Context)在运行时动态选择具体策略。核心是“面向接口编程”,避免大量条件分支,提升扩展性和可维护性。
使用纯虚函数声明算法行为,所有具体策略都继承并实现它:
// Strategy.h
class PaymentStrategy {
public:
virtual ~PaymentStrategy() = default;
virtual void pay(double amount) const = 0;
};
每个策略封装一种独立的支付逻辑,彼此解耦:
// 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
}
};
Co
ntext不关心具体实现,只依赖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
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。