C++设计模式之装饰者模式

news2024/7/6 20:11:08

文章目录

  • C++装饰者设计模式
    • 什么是装饰者模式
    • 优缺点
      • 优点
      • 缺点
    • 如何使用

C++装饰者设计模式

在这里插入图片描述

什么是装饰者模式

装饰者模式是一种设计模式,它允许我们动态地将行为附加到对象上,而无需改变对象本身的定义。它将一个对象的行为包装在一个独立的的对象中,这个对象既可以单独存在,也可以与其他对象组合在一起,从而灵活地改变类的行为。

优缺点

优点

  1. 灵活性强:装饰者模式允许我们在运行时动态地添加或修改对象的行为,从而可以更加灵活地设计程序。
  2. 可重用性:装饰者模式可以将一些通用的功能抽取出来,以便在不同的对象之间重用。
  3. 易于扩展:装饰者模式可以轻松地添加新的装饰者,而且不需要修改原始对象的代码。

缺点

  1. 增加了对象数量:由于每个对象都可以被装饰,因此程序中的对象数量可能会增加,这可能会导致程序变得复杂和难以维护。
  2. 可能会出现过多的继承关系:如果装饰者过多,可能会导致出现大量的继承关系,使程序变得复杂。
  3. 可能影响性能:由于每次调用都需要通过装饰者进行转发,可能会影响程序的性能。

如何使用

在这里插入图片描述

下面是一个使用C++实现装饰者模式的例子:

#include <iostream>  
  
// 定义一个接口  
class Shape {  
public:  
    virtual void draw() = 0;  
};  
  
// 实现接口的具体类  
class Circle : public Shape {  
public:  
    void draw() override {  
        std::cout << "Drawing Circle" << std::endl;  
    }  
};  
  
// 定义一个装饰器  
class Color {  
public:  
    virtual void draw(Shape\* shape) = 0;  
};  
  
// 实现一个具体的装饰器  
class RedColor : public Color {  
public:  
    void draw(Shape\* shape) override {  
        std::cout << "Drawing red circle" << std::endl;  
        shape->draw();  
    }  
};  
  
// 使用装饰器的例子  
int main() {  
    Shape* circle = new Circle();  
    Color* redColor = new RedColor();  
  
    redColor->draw(circle);  
  
    delete redColor;  
    delete circle;  
    return 0;  
}

在上面的例子中,我们首先定义了一个Shape接口和一个具体的类Circle。然后我们定义了一个装饰器Color接口和一个具体的装饰器RedColor。最后,我们在main函数中创建了一个Circle对象,并将其传递给RedColor对象进行处理。这样,RedColor就能够在绘制之前打印出一条信息,并调用Circledraw方法来绘制一个红色的圆。

需要注意的是,在使用装饰者模式时,应该避免出现过多的装饰者和继承关系,以保持程序简单和可维护。

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

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

相关文章

数据库事务--数据库事务隔离级别实战

2、演示环境 数据库及工具 ➢MySQL版本 5.5.47 ➢数据库工具 Navicat for MySQL 数据库命令 ➢查看数据库版本: select version();➢查看数据库现在的隔离级别: select session.tx_ isolation;➢修改隔离级别: set session.tx_ _isolation级别参数;➢级别参数: READ-UN…

内网横向移动—非约束委派约束委派

内网横向移动—非约束委派&约束委派 1. 委派攻击介绍1.1. 约束委派分类 2. 非约束委派2.1. 配置非约束委派2.1.1. 域内主机配置2.1.2. 注册对象2.1.3. 域内用户配置 2.2. 案例测试2.2.1. 查询服务账户2.2.2. 查询机器账户2.2.3. 机器通讯2.2.4. 导出票据2.2.5. 导入票据2.2…

算法题--二叉树(二叉树的最近公共祖先、重建二叉树、二叉搜索树的后序遍历序列)

目录 二叉树 题目 二叉树的最近公共祖先 原题链接 解析 二叉搜索树的最近公共节点 核心思想 答案 重建二叉树 题目链接 解析 核心思想 答案 二叉搜索树的后序遍历序列 原题链接 解析 核心思想 答案 二叉树 该类题目的解决一般是通过节点的遍历去实现&#x…

edge://settings/defaultbrowser default ie

Microsoft Edge 中的 Internet Explorer 模式 有些网站专为与 Internet Explorer 一起使用&#xff0c;它们具有 Microsoft Edge 等新式浏览器不支持的功能。 如果你需要查看其中的某个网站&#xff0c;可使用 Microsoft Edge 中的 Internet Explorer 模式。 大多数网站在新…

优先级队列 (堆)

目录 一&#xff0c;堆的概念 二&#xff0c; 堆的存储结构 三&#xff0c; 堆的实现 3.1 shiftDown() 3.2 shiftUp() 3.3 shiftDown 与 shiftUp 的时间复杂度 四&#xff0c;堆排序 一&#xff0c;堆的概念 堆常用于实现优先队列&#xff08;Priority Queue&#xff0…

【算法训练营】求最小公倍数+另类加法+走方格的方案数

7月31日 求最小公倍数题目题解代码 另类加法题目题解代码 走方格的方案数题目题解| 1 | 2 | 3 || 4 | 5 | 6 || 7 | 8 | 9 |代码 求最小公倍数 题目 点击跳转: 求最小公倍数 题解 最小公倍数 两数之积除以最大公约数&#xff0c;这里使用碾转相除法进行最大公约数的求解&am…

学习盒模型

1.是什么 2.标准模型 3.怪异模型 一、是什么 一个盒子由四部分组成&#xff1a; content、padding、border、margin 在CSS中&#xff0c;盒子模型可以分成&#xff1a; W3C 标准盒子模型IE 怪异盒子模型 默认情况下&#xff0c;盒子模型为W3C标准盒模型 二、标准盒模型 盒子总…

NetApp FAS存储系统磁盘更换详细步骤

说起更换磁盘&#xff0c;都会说非常简单&#xff0c;但无数次的血淋淋的教训让我们再次来审视一下更换磁盘的专业步骤。本文就是介绍最专业的也是最简单的磁盘更换步骤。常在河边走哪有不湿鞋&#xff0c;希望做了几十年攻城狮的你不要在这里翻船。 本文介绍的内容适用于Onta…

ELK日志管理平台架构和使用说明

一、部署架构 二、服务注册 2.1 日志解析服务 服务名&#xff1a;日志解析服务&#xff08;Logstash&#xff09; 服务默认端口&#xff1a;9600 2.2 日志查询服务 服务名&#xff1a;日志查询服务&#xff08;Kibana&#xff09; 服务默认端口&#xff1a;5601 三、对接…

光纤激光切割机是否属于环保设备

光纤激光切割机不属于环保设备。 环保设备是指用于控制环境污染、改善环境质量而由生产单位或建筑安装单位制造和建造出来的机械产品、构筑物及系统。 单纯的激光切割机当前是豁免环评的&#xff0c;比起普通二氧化碳激光切割机更节省空间和气体消耗量&#xff0c;光电转化率高…

C语言手撕单链表

一、链表的概念 链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;也就是内存存储不是像顺序表那么连续存储&#xff0c;而是以结点的形式一块一块存储在堆上的&#xff08;用动态内存开辟&#xff09;。 既然在内存上不是连续存储&#xff0c;那我们如何将这一…

代码随想录算法训练营第二十八天 | Leetcode随机抽题检测

Leetcode随机抽题检测--使用题库&#xff1a;Leetcode热题100 1 两数之和未看解答自己编写的青春版重点题解的代码日后再次复习重新写 49 字母异位词分组未看解答自己编写的青春版重点题解的代码日后再次复习重新写 128 最长连续序列未看解答自己编写的青春版重点关于 left 和 …

谷歌浏览器提示客户端和服务器不支持一般 SSL 协议版本或加密套件(亲测有效)

目录 一、定位问题二、升级TLS1.21、原理之前架构调整架构 2、配置nginx3、配置tomcat 三、访问nginx即可 最近访问一部分网站时&#xff0c;出现如下图所示 “ 此网站无法提供案例连接&#xff0c;客户端和服务器不支持一般 SSL 协议版本或加密套件 ” 的问题。 一、定位问题…

AIGC之AI绘画行业发展研究报告(2023)

全部140页&#xff0c;完整版pdf下载见文末。 链接&#xff1a;AIGC之AI绘画行业发展研究报告&#xff08;2023&#xff09; 提取码&#xff1a;关注 未来人智慧 回复 AIGC之AI绘画行业发展研究报告&#xff08;2023&#xff09;

C语言每日一题:11.《数据结构》链表分割。

题目一&#xff1a; 题目链接&#xff1a; 思路一&#xff1a;使用带头链表 1.构建两个新的带头链表&#xff0c;头节点不存储数据。 2.循环遍历原来的链表。 3.小于x的尾插到第一个链表。 4.大于等于x尾插到第二个链表。 5.进行链表合并&#xff0c;注意第二个链表的尾的下一…

IO进程线程第四天(8.1)

作业1&#xff1a; 从终端获取一个文件的路径以及名字。 若该文件是目录文件&#xff0c;则将该文件下的所有文件的属性显示到终端&#xff0c;类似ls -l该文件夹 若该文件不是目录文件&#xff0c;则显示该文件的属性到终端上&#xff0c;类似ls -l这单个文件 #include<…

ad+硬件每日学习十个知识点(16)23.7.27 (总线保持、lin报文、逻辑器件手册解读)

文章目录 1.总线保持是怎么实现的&#xff1f;有什么需要注意的&#xff08;驱动电流和电阻&#xff09;&#xff1f;2.LIN报文3.芯片datasheet的features、applications、description看完&#xff0c;应该能大致判断逻辑器件能否满足我们的要求。4.什么是逻辑器件的传输延时&a…

系统架构设计师_备考第1天

文章目录 前言一、软考历史与体系二、考试价值与意义三、软考报名与交费四、考试介绍五、综合备考策略 前言 从今天开始&#xff0c;会认真备考系统架构设计师&#xff0c;希望95天后&#xff0c;拿下软考证书。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可…

P3372 【模板】线段树 1(内附封面)

【模板】线段树 1 题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面两种操作&#xff1a; 将某区间每一个数加上 k k k。求出某区间每一个数的和。 输入格式 第一行包含两个整数 n , m n, m n,m&#xff0c;分别表示该数列数字的个数和操作的总个数。 …

深度学习(33)——CycleGAN(1)

深度学习&#xff08;33&#xff09;——CycleGAN&#xff08;1&#xff09; 完整项目在在这里&#xff1a;欢迎造访 文章目录 深度学习&#xff08;33&#xff09;——CycleGAN&#xff08;1&#xff09;1. Generator2. Discriminator3. fake pool4. loss定义5. 模型参数量6…