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

6. 装饰器模式

目录

  • 一、简介
  • 二、类图
  • 三、代码实现
    • 3.1 设计类图
    • 3.2 代码实现

一、简介

  • 模式中的角色
    • 装饰者(decorator):用来装饰别的对象的对象
    • 被装饰者(decoratee):被装饰的对象
  • 解决的问题
    • 动态的给一个对象添加一些额外的功能和职责

二、类图

在这里插入图片描述

  • Component:被装饰对象的抽象父类
  • ConcreteComponent:等待被装饰对象的实体类
  • Decorator:装饰品抽象父类
  • ConcreteDecoratorA:装饰品实体类

三、代码实现

3.1 设计类图

以不同型号的车的装饰品为例
在这里插入图片描述

3.2 代码实现

#include <iostream>class Car
{
protected:unsigned int cost;std::string description;public:virtual std::string getDescription() = 0;virtual unsigned int getCost() = 0;
};class A1Car : public Car
{
public:A1Car(unsigned int cost, const std::string& description){this->cost = cost;this->description = description;}std::string getDescription(){return this->description;}unsigned int getCost(){return this->cost;}};class A4Car : public Car
{
public:A4Car(unsigned int cost, const std::string& description){this->cost = cost;this->description = description;}std::string getDescription(){return this->description;}unsigned int getCost(){return this->cost;}
};class Decorator : public Car
{
protected:Car* m_car;unsigned int dec_cost;  //配件的价格std::string dec_description; //配件的描述
public:virtual std::string getDescription(){return m_car->getDescription() + this->dec_description;}virtual unsigned int getCost(){return this->dec_cost + m_car->getCost();}
};class GPS : public Decorator
{
public:GPS(unsigned int cost, const std::string& description, Car* obj){//std::cout << "new GPS: " << cost << std::endl;this->dec_cost = cost;this->dec_description = description;this->m_car = obj;}
};class Redar : public Decorator
{
public:Redar(unsigned int cost, const std::string& description, Car* obj){//std::cout << "new Redar: " << cost << std::endl;this->dec_cost = cost;this->dec_description = description;this->m_car = obj;}};int main()
{Car* a1 = new A1Car(10000, "A1Car");std::cout << "a1 cost:" << a1->getCost() << "; description: " << a1->getDescription() << std::endl;Car* a4 = new A4Car(15000, "A4Car");std::cout << "a4 cost:" << a4->getCost() << "; description: " << a4->getDescription() << std::endl;//给a4一个GPS配置a4 = new GPS(101, ",by GPS(RMB: 101)", a4);//再给a4一个Redar配置a4 = new Redar(98, ",by redar(RMB: 98)", a4);std::cout << "===========a1没加附加组件,因此价格不变===============" << std::endl;std::cout << a1->getDescription() << ". Cost: " << a1->getCost() << std::endl;std::cout << "===========a4加了GPS和redar两个组件,因此相对较贵=====" << std::endl;std::cout << a4->getDescription() << ". Cost: " << a4->getCost() << std::endl;return 0;
}
http://www.lryc.cn/news/593664.html

相关文章:

  • ROS2 视频采集节点实现
  • Redis常见线上问题
  • 基于LSTM的时间序列到时间序列的回归模拟
  • Keepalived 监听服务切换与运维指南
  • C study notes[1]
  • C语言:20250719笔记
  • CentOS 清理技巧
  • 第二次总结(xss、js原型链)
  • 在开发板tmp目录下传输文件很快的原因和注意事项:重启开发板会清空tmp文件夹,记得复制文件到其他地方命令如下(cp 文件所在路径 文件要复制到的路径—)
  • 【Linux】重生之从零开始学习运维之Nginx之server小实践
  • 定时器中BDTR死区时间和刹车功能配置
  • AWS Partner: Accreditation (Technical)
  • Qt Graphs 模块拟取代 charts 和 data visualization还有很长的路要走
  • SPARKLE:深度剖析强化学习如何提升语言模型推理能力
  • stm32继电器使用方法
  • 【RK3576】【Android14】UART开发调试
  • 从零开始学Tailwind CSS : 颜色配置原理与实践
  • EasyExcel使用
  • 创建套接字并bind的详细过程
  • 深度学习-线性神经网络
  • 深度学习Depth Anything V2神经网络实现单目深度估计系统源码
  • 短视频矩阵的未来前景:机遇无限,挑战并存
  • Maven常用知识总结
  • 代码随想录算法训练营第二十天|回溯part02
  • 电阻耐压参数学习总结
  • 动态规划——数位DP经典题目
  • 【深度学习-Day 38】破解深度网络退化之谜:残差网络(ResNet)核心原理与实战
  • 从0到1搭建一个Rag引擎(ollama+Qwen3)
  • 实现el-select下拉框,下拉时加载数据
  • Docker容器原理和启动策略