[C/C++] -- 装饰器模式

news2025/2/23 11:04:35

装饰器模式是一种结构型设计模式,它允许在不改变原始对象的基础上动态地扩展其功能。这种模式通过将对象包装在装饰器类的对象中来实现,每个装饰器对象都包含一个原始对象,并可以在调用原始对象的方法之前或之后执行一些额外的操作。

装饰器模式通常用于以下情况:

  1. 在不修改现有代码的情况下扩展对象的功能:当你需要在不改变现有代码的情况下为对象添加新的功能时,装饰器模式是一种非常有用的方法。
  2. 避免使用子类继承:通过继承来扩展对象的功能可能会导致类爆炸(class explosion),而装饰器模式可以避免这种问题。
  3. 动态地添加或删除功能:由于装饰器可以在运行时动态地添加或删除功能,因此它提供了一种更灵活的方式来管理对象的功能。

#include <iostream>
#include <memory>
using namespace std;

/*
装饰器模式 Decorator
装饰器:主要是增加现有类的功能  但是:增加现有类的功能,还有一个方法,就新增一个子类
为了增强现有类的功能,通过实现子类的方式,重写接口,是可以完成功能,但是代码中有太多子类添加进来
*/
class Car
{
public:
    virtual void show() = 0;
};

//三个实体汽车类
class Bmw : public Car
{
public:
    void show()
    {
        cout << "这是一辆宝马汽车,低配" << endl;
    }
};

class Aodi:public Car
{
public:
    void show()
    {
        cout << "这是一辆奥迪汽车,低配" << endl;
    }
};

class Benchi:public Car
{
public:
    void show()
    {
        cout << "这是一辆奔驰汽车,低配" << endl;
    }
};

//装饰器的基类
class CarDecorator:public Car
{
public:
    
    CarDecorator(Car *c):pCar(c){}
    virtual void show()
    {
        pCar->show();
    }
private:
    Car *pCar;
};
//装饰器1 自动驾驶
class ConcreteDecorator01:public Car
{
public:
    ConcreteDecorator01(Car *c):pCar(c){}
    void show()
    {
        pCar->show();
        cout<<",自动驾驶"<<endl;
    }
private:
    Car *pCar;
};

//装饰器2 车载音乐
class ConcreteDecorator02:public Car
{
public:
    ConcreteDecorator02(Car *c):pCar(c){}
    void show()
    {
        pCar->show();
        cout<<",车载音乐"<<endl;
    }
private:
    Car *pCar;
};
int main()
{
    Car *pCar = new Benchi();
    pCar->show();
    cout<<endl;
    //装饰器1
    Car *pCar01 = new ConcreteDecorator01(new Bmw());
    pCar01->show();
    cout<<endl;
    //装饰器2
    Car *pCar02 = new ConcreteDecorator02(new Aodi());
    pCar02->show();

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1652576.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows环境下 postgresql v12 绿色版+postgis 3.4.1版本配置,空间数据库迁移

windows环境下 postgresql v12 绿色版+postgis 3.4.1版本配置,空间数据库迁移 一、软件环境 操作系统:windows 11 pg免安装版数据库:postgresql-12.17-1-windows-x64-binaries.zip 下载地址:https://get.enterprisedb.com/postgresql/postgresql-12.18-1-windows-x64-bina…

第二证券今日投资参考:北方稀土上调挂牌价 磷化工产业链迎催化

昨日&#xff0c;沪指早盘窄幅震动&#xff0c;午后小幅拉升&#xff0c;科创50指数弱势下探。截至收盘&#xff0c;沪指涨0.22%报3147.74点&#xff0c;深证成指微跌0.08%报9770.94点&#xff0c;创业板指跌0.14%报1892.54点&#xff0c;上证50指数涨0.16%&#xff0c;科创50指…

智能AI对话系统源码+绘画功能二合一 带完整的代码安装包以及搭建教程

随着人工智能技术的不断进步&#xff0c;人们对于AI应用的需求也日益多元化。在智能AI对话系统方面&#xff0c;用户期望能够获得更加自然、智能的交互体验&#xff1b;而在绘画领域&#xff0c;AI技术的加入则为艺术创作带来了全新的可能性。小编给大家分享一款智能AI对话系统…

vs2019 - 替换vs2019自带的cmake

文章目录 vs2019 - 替换vs2019自带的cmake概述笔记启动vs2019本地x64命令行的脚本查看vs2019自带的cmake的位置删掉旧版cmake将新版cmake的安装目录内容替换过来。查看vs2019本地x64命令行中的cmake版本配置为vs2019x64工程END vs2019 - 替换vs2019自带的cmake 概述 在看一个…

2024年钉钉群直播回放怎么保存

钉钉群直播回放下载插件我已经打包好了&#xff0c;有需要的自己下载一下 小白钉钉工具打包链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;1234 --来自百度网盘超级会员V10的分享 1.首先解压好我给大家准备好的压缩包 2.再把逍遥一仙下载器解压出来&#xff0…

DInet

&#xff08;1&#xff09;数据&#xff1a; 1&#xff09;&#xff1a;随机获取5帧参考帧 2&#xff09;&#xff1a;处理这5帧连续帧&#xff0c;:source_frames:连续5帧的crop_moth b)audio_list:连续5帧的每一帧对应的5帧音频mel特征 c):refs:fintune 固定参考帧&#xff0…

AngusTester安装请求代理

一、介绍 请求代理程序(AngusProxy)提供两个方面作用&#xff1a; 代理Http和WebSocket协议接口调试请求&#xff0c;解决浏览器跨域限制问题。对代理请求客户化处理支持&#xff0c;允许用户对代理请求进行二次处理&#xff0c;如&#xff1a;请求参数签名。 二、类型 为了…

揭秘SSL证书一年费用:网络安全预算规划指南

网络安全在数字化时代的重要性不言而喻&#xff0c;而SSL证书作为保护网站安全的关键工具&#xff0c;其费用问题自然成为了用户们关注的重点。本文旨在深入分析SSL证书的一年所需成本&#xff0c;帮助用户们合理规划自己的网络安全预算。 我们需要了解SSL证书的基本概念。SSL…

poisson分布及其stata实现

1. 概念 泊松回归&#xff08;Poisson regression&#xff09;是用来为计数资料和列联表建模的一种回归分析。泊松回归假设反应变量Y是泊松分布&#xff0c;并假设它期望值的对数可被未知参数的线性组合建模。泊松回归模型有时&#xff08;特别是当用作列联表模型时&#xff0…

深入解析:C语言中的八大经典排序算法全揭秘

目录 排序的概念及运用 排序概念 排序运用 常见排序算法 八大排序详解 直接插入排序 基本思想 代码实现 希尔排序 基本思想 代码实现 选择排序 基本思想 代码实现 堆排序 堆的向下调整算法&#xff08;前提&#xff09; 基本思想 代码实现 冒泡排序 基本思…

yolo world 瑞芯微芯片rknn部署、地平线芯片Horizon部署、TensorRT部署

特别说明&#xff1a;参考官方开源的 yoloworld 代码、瑞芯微官方文档、地平线的官方文档&#xff0c;如有侵权告知删&#xff0c;谢谢。 模型和完整仿真测试代码&#xff0c;放在github上参考链接 模型和代码。 yoloworld出来的有一段时间了&#xff0c;还没有盘到板端上玩一玩…

小红书高级电商运营课,从0开始做小红书电商(18节课)

详情介绍 课程内容&#xff1a; 第1节课:学习流程以及后续实操流程注意事项,mp4 第2节课:小红书店铺类型解析以及开店细节.mp4 第3节课:小红书电商运营两种玩法之多品店铺解析,mp4 第4节课:小红书电商运营两种玩法之单品店铺解析,mp4 第5节课:选品课(多品类类目推荐).mp4 …

政安晨:【Keras机器学习示例演绎】(三十九)—— 使用 FNet 进行文本分类

目录 简介 模型 设置 加载数据集 对数据进行标记 格式化数据集 建立模型 训练我们的模型 与变换器模型比较 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益&…

“中国汉字”的英语表达|柯桥考级英语生活英语商务口语培训

汉字&#xff0c;又称中文字、中国字、方块字。汉字是表意文字&#xff0c;一个汉字通常表示汉语里的一个词或一个语素&#xff0c;这就形成了音、形、义统一的特点。 我们通常用“Chinese character”表示“汉字”而不用“Chinese word”. &#x1f534; 例句&#xff1a; C…

萨科微与金航标:对标国际巨头,精进创新,打造行业新标杆

萨科微slkor&#xff08;www.slkoric.com&#xff09;对标企业包括德州仪器TI、AOS、ONsemi等国际知名企业&#xff0c;深入研究这些企业的产品定义、管理模式、技术创新和市场策略&#xff0c;为自身发展提供更多的参考和启示。金航标和萨科微在搞好产品的研发和质量管理的同时…

EXCEL数据快速上传至SAP透明表

文章目录 前言一、案例介绍/笔者需求二、备份数据三、数据处理转化 a.EXCEL转为TXT注意事项 b.EXCEL转为TXT 四、ABAP结合内表更新数据至透明表 a.代码实现 b.断点TXT上传至内表 c.查看上传结果 五、总结 前言 这篇文章…

【报错处理】ib_write_bw执行遇到Found Incompatibility issue with GID types.原因与解决办法

文章目录 拓扑现象根因解决办法解决后效果 拓扑 #mermaid-svg-zheSkw17IeCpjnVA {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-zheSkw17IeCpjnVA .error-icon{fill:#552222;}#mermaid-svg-zheSkw17IeCpjnVA .error…

【USB 3.2 Type-C】 端口实施挑战的集成解决方案 (补充一)

USB 3.2 Type-C 端口集成 补充&#xff0c;上一篇感觉还有没理解到位的一部分&#xff1b; 一、只做正反插的通信&#xff0c;已经差不多够了&#xff0c;但是这并不是完整的TYPE-C,必须要补充上PD; 参考连接&#xff1a; TYPE-C PD浅谈&#xff08;一&#xff09;https://w…

【声明ACL权限】

声明ACL权限 当应用在申请权限来访问必要的资源时&#xff0c;发现部分权限的等级比应用APL等级高&#xff0c;开发者可以选择通过ACL方式来解决等级不匹配的问题。 举例说明&#xff0c;如果应用需要使用全局悬浮窗&#xff0c;需要申请 ohos.permission.SYSTEM_FLOAT_WINDO…