当前位置: 首页 > news >正文

C++ 设计模式 《小明的奶茶加料风波》

👨‍🎓 模式名称:装饰器模式(Decorator Pattern)

👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料:
有的同学要加波霸 🟤,有的要加椰果 🥥,还有的要加奶盖 🥛。
但每个“加料”组合都要写一个新类?小明一开始不以为意,直到……

❌ 没使用装饰器模式的惨状:

#include <iostream>
#include <string>class MilkTea {
public:virtual std::string getDescription() = 0;virtual double cost() = 0;virtual ~MilkTea() {}
};class OriginalMilkTea : public MilkTea {
public:std::string getDescription() override {return "原味奶茶";}double cost() override {return 8.0;}
};class MilkTeaWithBoba : public MilkTea {
public:std::string getDescription() override {return "原味奶茶 + 波霸";}double cost() override {return 10.0;}
};class MilkTeaWithBobaAndCheese : public MilkTea {
public:std::string getDescription() override {return "原味奶茶 + 波霸 + 奶盖";}double cost() override {return 13.0;}
};int main() {MilkTea* tea1 = new OriginalMilkTea();MilkTea* tea2 = new MilkTeaWithBoba();MilkTea* tea3 = new MilkTeaWithBobaAndCheese();std::cout << tea3->getDescription() << " 价格:¥" << tea3->cost() << std::endl;delete tea1;delete tea2;delete tea3;return 0;
}

在这里插入图片描述

💥 小明懵了:

加个椰果再写个类?
波霸 + 奶盖 + 椰果再写?
🍵 加料 2^N 种组合,类数直接爆炸!

✅ 使用装饰器模式后:灵活加料,优雅解耦!

#include <iostream>
#include <string>
#include <memory>// 奶茶基类
class MilkTea {
public:virtual std::string getDescription() = 0;virtual double cost() = 0;virtual ~MilkTea() {}
};// 原味奶茶
class OriginalMilkTea : public MilkTea {
public:std::string getDescription() override {return "原味奶茶";}double cost() override {return 8.0;}
};// 装饰器基类
class ToppingDecorator : public MilkTea {
protected:std::shared_ptr<MilkTea> tea;
public:ToppingDecorator(std::shared_ptr<MilkTea> t) : tea(t) {}
};// 加波霸
class Boba : public ToppingDecorator {
public:Boba(std::shared_ptr<MilkTea> t) : ToppingDecorator(t) {}std::string getDescription() override {return tea->getDescription() + " + 波霸🟤";}double cost() override {return tea->cost() + 2.0;}
};// 加奶盖
class Cheese : public ToppingDecorator {
public:Cheese(std::shared_ptr<MilkTea> t) : ToppingDecorator(t) {}std::string getDescription() override {return tea->getDescription() + " + 奶盖🥛";}double cost() override {return tea->cost() + 3.0;}
};// 加椰果
class Coconut : public ToppingDecorator {
public:Coconut(std::shared_ptr<MilkTea> t) : ToppingDecorator(t) {}std::string getDescription() override {return tea->getDescription() + " + 椰果🥥";}double cost() override {return tea->cost() + 1.5;}
};int main() {// 原味奶茶 + 波霸 + 奶盖 + 椰果!std::shared_ptr<MilkTea> order = std::make_shared<OriginalMilkTea>();order = std::make_shared<Boba>(order);order = std::make_shared<Cheese>(order);order = std::make_shared<Coconut>(order);std::cout << "🎉 " << order->getDescription() << " 价格:¥" << order->cost() << std::endl;return 0;
}

在这里插入图片描述

🧠 总结:装饰器模式的价值

问题没使用使用装饰器
类数量爆炸(组合越多类越多)只需一个装饰器类一类加料
灵活性不能动态组合可以任意组合加料
可维护性每改一组合要改多个类可拓展性强,易维护

✅ 适用场景

  • 不同功能组合需要动态叠加(如小明的加料奶茶🍵、网页组件、技能系统等)

  • 不想通过继承创建过多子类

  • 需要在运行时添加功能而非编译期

http://www.xdnf.cn/news/907327.html

相关文章:

  • 【手写数据库核心揭秘系列】第10节 SQL解析树的结构,语言识别与程序执行之间的桥梁
  • mysql错误码 2013 解决方案
  • 2003-2024年高铁列车信息数据
  • OS11.【Linux】vim文本编辑器
  • Steam爬取相关游戏评测
  • 服务器数据恢复—服务器raid5阵列崩溃如何恢复数据?
  • 东芝Toshiba DP-4528AG打印机信息
  • 算法打卡16天
  • Mysql的卸载与安装
  • LMG1020YFFR 电子元器件详解
  • 惠普HP Deskjet 9600 打印机信息
  • event.dataTransfer 教程
  • Android端口转发
  • 从模型到生产力:应用集成如何帮助AI实现业务落地
  • 【Android】Android Studio项目代码异常错乱问题处理(2020.3版本)
  • 分布式锁-Redisson实现
  • MySQL用户和授权
  • C++.OpenGL (7/64)摄像机(Camera)
  • SpringBoot项目启动 错误: 找不到或无法加载主类 com.abc.demo.DemoApplication
  • 使用pwm控制一个舵机摆动的速度
  • 汉诺塔问题深度解析
  • PlayDiffusion上线:AI语音编辑进入“无痕时代”
  • const和constexpr详解
  • modelscope安装并下载模型文件
  • Google机器学习实践指南(机器学习模型泛化能力)
  • Docker + Nginx + Logrotate 日志管理与轮换实践
  • Spring Boot消息系统开发指南
  • 湖北理元理律师事务所:构建科学债务优化体系的四重维度
  • 6.6本日总结
  • 【办公类-104-01】20250606通义万相50分一天用完,通义万相2.1专业版测试