策略模式通过封装算法并动态切换实现行为解耦:定义抽象基类声明纯虚接口,具体策略类继承实现,上下文持策略指针运行时委托执行。
策略模式通过定义一系列算法,把它们一个个封装起来,并且使它们可以互相替换。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
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。