C++如何实现一个策略(Strategy)设计模式?(代码示例)
技术百科
冰火之心
发布时间:2025-12-31
浏览: 次 策略模式通过封装算法并动态切换实现行为解耦:定义抽象基类声明纯虚接口,具体策略类继承实现,上下文持策略指针运行时委托执行。
策
略模式通过定义一系列算法,把它们一个个封装起来,并且使它们可以互相替换。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
# 多个
# 客户端
# public
# c++
# String
# double
# class
# 指针
# 子类
# 接口
# 委托
# red
# 封装
# 算法
# 继承
# 虚函数
# const
# 使它
# 不关心
# 或引用
# 纯虚函数
# toolbar
# pay
# false
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何使用Golang处理网络超时错误_Golang
- MAC如何安装Git版本控制工具_MAC开发环境配
- c# Task.Yield 的作用是什么 它和Ta
- Win11如何添加/删除输入法 Win11切换中英
- c++ unordered_map怎么用 c++哈
- Python数据挖掘核心算法实践_聚类分类与特征工
- Win11怎么关闭触摸键盘图标_Windows11
- php订单日志怎么导出excel_php导出订单日
- Windows10任务栏图标变成白色文件_Win1
- 如何使用正则表达式提取以编号开头、后跟多个注解的完
- phpstudy本地环境mysql忘记密码_重置m
- Win11怎么查看显卡温度 Win11任务管理器查
- Win11如何关闭小娜Cortana Win11禁
- c++ try_emplace用法_c++ map
- Windows10怎么查看系统激活状态_Windo
- Win11怎么硬盘分区 Win11新建磁盘分区详细
- C++如何使用std::transform批量处理
- Windows10系统怎么查看防火墙状态_Win1
- 电脑无法识别U盘怎么办 Windows磁盘管理与驱
- 如何在 Go 结构体中正确初始化 map 字段
- php怎么捕获异常_trycatch结构处理运行时
- 如何在Mac上搭建Golang开发环境_使用Hom
- C++如何使用Qt创建第一个GUI窗口?(入门教程
- Python面向对象实战讲解_类与设计模式深入理解
- 如何在 Go 中高效缓存与分发网络视频流
- Windows蓝屏错误0x0000001E怎么修复
- Go语言中slice追加操作的底层共享机制解析
- Win10电脑怎么设置网络名称_Windows10
- Windows10系统怎么查看显卡型号_Win10
- php怎么下载安装后测试是否成功_简单脚本验证方法
- 如何使用Golang指针与接口结合_实现方法调用和
- Python装饰器设计思路_功能增强机制说明【指导
- Win11声音忽大忽小怎么办 Win11音频增强功
- Windows10系统怎么查看CPU核心数_Win
- PythonPandas数据分析教程_数据清洗与处
- Win11触摸板没反应怎么办_开启Win11笔记本
- Windows10电脑怎么设置自动连接WiFi_W
- Win11怎么关闭自动调节屏幕亮度_Windows
- PyTorch DDP 多进程训练在 Kaggle
- 如何解决Windows字体显示模糊的问题?(Cle
- Python生成器表达式内存优化_惰性计算说明【指
- Python项目回滚策略_发布安全说明【指导】
- Win11怎样安装钉钉客户端_Win11安装钉钉教
- Win11怎么更改账户头像_Windows 11自
- Win11怎么关闭定位服务 Win11禁止应用获取
- php下载安装包太大怎么下载_分卷压缩下载方法【教
- 手机php怎么转mp4_手机端php文件转mp4a
- 如何在 Go 中调用动态链接库(.so)中的函数
- 如何使用Golang实现多重错误处理_Golang
- 如何使用Golang encoding/json解

QQ客服