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

《装饰器模式(极简c++)》

         本文章属于专栏- 概述 - 《设计模式(极简c++版)》-CSDN博客


模式说明

  • 方案: 装饰类和派生类同根,然后装饰类中放一个派生类,以在接口不动的情况下增加功能
  • 优点: 可以灵活地扩展对象功能,相比继承更易读。
  • 缺点: 增加了许多小对象,易于出错,不易调试。

本质思想: 派生类和装饰类都继承Base,然后装饰器类中放一个Base指针,存派生类。这样装饰器类和派生类可以放一个数组中,调用相同接口,这样部分类的功能看起来像被装饰了。前面是核心思想,基于这个再扩展,很容易基于装饰器加装饰器,或者把有相似接口的装饰器抽象出一个装饰器基类。

实践建议

  • 注意组合关系,确保装饰器和被装饰对象之间的接口一致。
  • 装饰器的功能应该是可组合的,可叠加的。

代码示例

#include <iostream>// Component Interface
class Bird {
public:virtual void fly() const = 0;
};// Concrete Component
class Sparrow : public Bird {
public:void fly() const override {std::cout << "Sparrow is flying." << std::endl;}
};// Concrete Decorator
class RedFeatherDecorator : public Bird {
private:Bird *bird;public:explicit RedFeatherDecorator(Bird *b) : bird(b) {}void fly() const override {bird->fly();std::cout << "With red feathers." << std::endl;}
};int main() {Bird *sparrow = new Sparrow();Bird *redSparrow = new RedFeatherDecorator(sparrow);redSparrow->fly();/* 
输出:Sparrow is flying.With red feathers.
*/delete sparrow;delete redSparrow;return 0;
}

相关文章:

《装饰器模式(极简c++)》

本文章属于专栏- 概述 - 《设计模式&#xff08;极简c版&#xff09;》-CSDN博客 模式说明&#xff1a; 方案&#xff1a; 装饰类和派生类同根&#xff0c;然后装饰类中放一个派生类&#xff0c;以在接口不动的情况下增加功能优点&#xff1a; 可以灵活地扩展对象功能&#xf…...

Spring Boot 整合分布式搜索引擎 Elastic Search 实现 自动补全功能

文章目录 ⛄引言一、分词器⛅拼音分词器⚡自定义分词器 二、自动补全查询三、自动补全⌚业务需求⏰实现酒店搜索自动补全 四、效果图⛵小结 ⛄引言 本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;…...

实现一个Google身份验证代替短信验证

最近才知道公司还在做国外的业务&#xff0c;要实现一个登陆辅助验证系统。咱们国内是用手机短信做验证&#xff0c;当然 这个google身份验证只是一个辅助验证登陆方式。看一下演示 看到了嘛。 手机下载一个谷歌身份验证器就可以 。 谷歌身份验证器&#xff0c;我本身是一个基…...

Spring框架与Spring Boot的区别和联系

引言 Spring框架和Spring Boot都是Java生态中最受欢迎的开源框架&#xff0c;它们各自扮演着不同的角色&#xff0c;帮助开发者构建高效的企业级应用。本教程将从零基础的角度出发&#xff0c;让你轻松理解这两者的区别和联系。 Spring框架简介 Spring框架&#xff0c;简称Spri…...

[OpenCV学习笔记]Qt+OpenCV实现图像灰度反转、对数变换和伽马变换

目录 1、介绍1.1 灰度反转1.2 图像对数变换1.3 图像伽马变换 2、效果图3、代码实现4、源码展示 1、介绍 1.1 灰度反转 灰度反转是一种线性变换&#xff0c;是将某个范围的灰度值映射到另一个范围内&#xff0c;一般是通过灰度的对调&#xff0c;突出想要查看的灰度区间。 S …...

【大数据】Flink学习笔记

文章目录 认识FlinkDocker安装Flink基本概念Flink的特点Flink 和 Spark Streaming 对比 基本使用WordCount实现依赖 批模式代码流模式代码网络流模式代码在web UI上提交代码创建项目[^1]编写代码配置打包在Web UI上提交 Flink 架构系统架构核心概念并行度算子链(Opeartor Chain…...

社交网络的未来:Facebook如何塑造数字社交的下一章

引言 社交网络已成为我们生活中不可或缺的一部分&#xff0c;而Facebook作为其领军者&#xff0c;一直在塑造着数字社交的未来。本文将深入探讨Facebook在未来如何塑造数字社交的下一章&#xff0c;并对社交网络的发展趋势进行展望和分析。 1. 引领虚拟社交的潮流 Facebook将…...

RabbitMQ 延时消息实现

1. 实现方式 1. 设置队列过期时间&#xff1a;延迟队列消息过期 死信队列&#xff0c;所有消息过期时间一致 2. 设置消息的过期时间&#xff1a;此种方式下有缺陷&#xff0c;MQ只会判断队列第一条消息是否过期&#xff0c;会导致消息的阻塞需要额外安装 rabbitmq_delayed_me…...

【Django】枚举类型数据

模型 在模型里主要增加两项内容&#xff1a; 枚举表字段增加choices class Snort(CoreModel):PAGE_TYPE_CHOICES [(1, 失陷主机检测), # 1是保存到数据库里的数据&#xff0c;失陷主机检测是显示在前端的(2, 远程漏洞攻击检测),(3, 可疑流量行为),(4, WEB检测),]page_type…...

java实现https连接总是要报no cipher suites in common

遇到“no cipher suites in common”这样的错误通常意味着客户端和服务器之间没有共同支持的加密套件&#xff08;Cipher Suite&#xff09;。这个问题可能由多个原因引起&#xff0c;包括但不限于SSL/TLS配置错误、Java安全策略限制、客户端或服务器不支持的加密算法等。解决这…...

[C++初阶] 爱上C++ : 与C++的第一次约会

&#x1f525;个人主页&#xff1a;guoguoqiang &#x1f525;专栏&#xff1a;我与C的爱恋 本篇内容带大家浅浅的了解一下C中的命名空间。 在c中&#xff0c;名称&#xff08;name&#xff09;可以是符号常量、变量、函数、结构、枚举、类和对象等等。工程越大&#xff0c;名称…...

STM32技术打造:智能考勤打卡系统 | 刷卡式上下班签到自动化解决方案

文章目录 一、简易刷卡式打卡考勤系统&#xff08;一&#xff09;功能简介原理图设计程序设计 哔哩哔哩&#xff1a; https://www.bilibili.com/video/BV1NZ421Y79W/?spm_id_from333.999.0.0&vd_sourcee5082ef80535e952b2a4301746491be0 一、简易刷卡式打卡考勤系统 &…...

module ‘numpy‘ has no attribute ‘int‘

在 NumPy 中&#xff0c;如果遇到了错误提示 "module numpy has no attribute int"&#xff0c;这通常意味着正在尝试以错误的方式使用 NumPy 的整数类型。从 NumPy 1.20 版本开始&#xff0c;numpy.int 已经不再是一个有效的属性&#xff0c;因为 NumPy 不再推荐使用…...

MFC(一)搭建空项目

安装MFC支持库 创建空白桌面程序 项目相关设置 复制以下代码 // mfc.h #pragma once #include <afxwin.h>class MyApp : public CWinApp { public:virtual BOOL InitInstance(); };class MyFrame : public CFrameWnd { public:MyFrame();// 消息映射机制DECLARE_…...

OKCC的API资源管理平台怎么用?

API资源管理平台&#xff0c;重点是“资源”管理平台&#xff0c;不是API接口管理平台。 天天讯通推出的API资源管理平台&#xff0c;类似昆石的VOS系统&#xff0c;区别是VOS是SIP资源管理系统&#xff0c;我们的API资源管理平台是API资源管理系统&#xff08;AXB、AX、回拨AP…...

CentOS 7 安装python 3.7 需要必要的依赖。

在 CentOS 7 上部署 Python 3.7 可以通过源代码编译安装来实现。以下是大致的步骤&#xff1a; 安装必要的依赖&#xff1a; bashCopy Code sudo yum install gcc openssl-devel bzip2-devel libffi-devel 下载 Python 3.7 源代码并进行编译安装&#xff1a; bashCopy Code wg…...

美术馆设计方案优化布局与设施提升观众体验!

如今&#xff0c;美术馆不仅仅是作为展示艺术作品的平台&#xff0c;也是吸引公众参与和创造独特体验的数字艺术体验空间&#xff0c;因此许多传统美术馆在进行翻修改造时&#xff0c;都会更加注重用户体验&#xff0c;并在其中使用大量的多媒体互动&#xff0c;让参观者能够在…...

数据库基础原理

宏观 数据库的实现原理分为四个部分&#xff1a; 网络通信 网络协议 硬盘存储 内存分配 微观 硬盘存储 数据库是持久化的&#xff0c;而持久化如何实现的&#xff0c;我们不难想到磁盘可以持久化存储&#xff0c;所以数据库所有持久化的数据都是以文件形式存在磁盘中的…...

Pandas操作MultiIndex合并行列的Excel,写入读取以及写入多余行及Index列处理,插入行,修改某个单元格的值,多字段排序

Pandas操作MultiIndex合并行列的excel&#xff0c;写入读取以及写入多余行及Index列处理&#xff0c;多字段排序尽量保持原来的顺序 1. 效果图及问题2. 源码参考 今天是谁写Pandas的 复合索引MultiIndex&#xff0c;写的糊糊涂涂&#xff0c;晕晕乎乎。 是我呀… 记录下&#…...

工作总结5

1.taro框架使用map标签出现的错误 这个问题困扰很长时间&#xff0c;在频繁切换页面渲染的时候出现左边不显示&#xff0c;我理解的是变量没有到达map标签的属性上&#xff0c;那我就想是不是setState太慢了&#xff0c;然后又用了变量&#xff0c;本地缓存等&#xff0c;都没有…...

速通汇编(二)汇编mov、addsub指令

一&#xff0c;mov指令 mov指令的全称是move&#xff0c;从字面上去理解&#xff0c;作用是移动&#xff08;比较确切的说是复制&#xff09;数据&#xff0c;mov指令可以有以下几种形式 无论哪种形式&#xff0c;都是把右边的值移动到左边 mov 寄存器&#xff0c;数据&#…...

软考 - 系统架构设计师 - 构件组装技术

概念 构件组装是将库中的构件经修改后相互连接&#xff0c;或者将它们和当前开发项目中的软件元素进行连接&#xff0c;最终构成新的目标构件。 构件组装技术是基于构件的软件开发的核心技术&#xff0c;也是构件技术研究的重点和难点。构件组装的目的是利用现有的构件组装成新…...

2010年之前电脑ubuntu安装nvidia驱动黑屏处理

装好驱动 仿真fps直接到60Hz 陈旧设备 都是非常老旧的电脑&#xff0c;没钱换新电脑&#xff0c;就这么穷…… 电脑详细配置&#xff1a; 冲动 想装显卡驱动提升一下性能&#xff0c;结果……黑了 黑习惯了也无所谓&#xff0c;几分钟就能解决&#xff0c;关键还是太穷&…...

类与对象中C++

加油&#xff01;&#xff01;&#xff01; 文章目录 前言 一、类的6个默认成员函数 ​编辑 二、构造函数 1.概念 三、析构函数 1.概念 2.特性 四、拷贝构造函数 1.概念 2.特征 拷贝构造函数典型调用场景 五、赋值运算符重载 1.运算符重载 2.赋值运算符重载 赋值运算符重载格式…...

k8s 集群重启报错:The connection to the server 192.168.92.26:6443 was refused

[rootk8s-master ~]# kubectl get node The connection to the server 192.168.92.26:6443 was refused - did you specify the right host or port?查到是kubelet进程没有启动 [rootk8s-master ~]# systemctl status kubelet ● kubelet.service - kubelet: The Kubernetes …...

国内好用的chatGPT和AI绘图工具

分享一个比较好用的AI 分享一个比较好用的AI&#xff0c;只是需要开通会员&#xff0c;目前官网的价格是&#xff1a;298&#xff0c;开通之后可以使用chatgpt4、AI绘画、图片融合等等&#xff01;不开通的话是可以免费使用15次的&#xff0c;下面是一些介绍图片&#xff01;链…...

蚂蚁庄园3.31今日答案春季美食“雷竹笋”之所以得名是因为出笋与打雷有关吗?

蚂蚁庄园是一款爱心公益游戏&#xff0c;用户可以通过喂养小鸡&#xff0c;产生鸡蛋&#xff0c;并通过捐赠鸡蛋参与公益项目。用户每日完成答题就可以领取鸡饲料&#xff0c;使用鸡饲料喂鸡之后&#xff0c;会可以获得鸡蛋&#xff0c;可以通过鸡蛋来进行爱心捐赠。其中&#…...

零基础入门转录组数据分析——绘制差异火山图

零基础入门转录组数据分析——绘制差异火山图 差异分析的火山图(Volcano Plot)在生物信息学数据分析中,特别是在基因表达差异分析中,是一个非常直观和有用的工具。 本教程将从导入的数据结构开始,一步步带大家在R中绘制好看的火山图,最后对火山图进行解读,确保读者理解…...

C++进阶,手把手带你学继承

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;c大冒险 总有光环在陨落&#xff0c;总有新星在闪烁 【本节目标】 1.继…...

Java自带的线程池及调用、ThreadPoolExecutor类(线程池的7大参数)、任务队列及底层原理

day32 线程池 引入 一个线程完成一项任务所需时间为&#xff1a; 创建线程时间 - Time1线程中执行任务的时间 - Time2销毁线程时间 - Time3 注意&#xff1a;优化在Time1&#xff0c;Time3(创建销毁线程费时间) 为什么需要线程池 线程池技术正是关注如何缩短或调整Time1和Tim…...

wordpress的live2D/网络推广优化网站

三极管搭的常用逻辑门&#xff1a; 转载于:https://www.cnblogs.com/nickchan/archive/2011/08/24/3104518.html...

wordpress 分享后可见/楚雄今日头条新闻

那是因为你没有破解&#xff0c;你只是选择了试用30天 接下来我讲解一下如何破解&#xff1a; 先去网上下载一个13.0破解器&#xff0c;按照说明操作即可 需要一个licence.data文件 把里面的xxxxxx地方用quartus软件tools&#xff0c;licence那儿的第一个字符串去代替即可 …...

怎么做彩票网站的代理/新闻媒体发布平台

要开始我是非常新的自举&#xff0c;但我想要做一些类似于这个例子&#xff1a;text over background image但在一个引导框架内。我曾尝试在导航栏下面的容器内创建一个div&#xff0c;但似乎在背后的文字背后放置了白色背景......您可以在此处看到我的代码&#xff1a;JSFiddl…...

深圳做微信网站设计/河南平价的seo整站优化定制

大家好&#xff0c;最近不少小伙伴在学 Python&#xff0c;想找个好玩的练手项目。那今天分享一个简单、好玩&#xff0c;适合新手的 Python 小项目。文章较长&#xff0c;建议收藏、喜欢关注、点赞&#xff0c;文末提供技术交流群。 以下是具体项目&#xff1a; 本文将以哔哩…...

长沙网站建设价格/网站设计与制作教程

2019独角兽企业重金招聘Python工程师标准>>> http://smallcultfollowing.com/babysteps/blog/categories/rust/ 转载于:https://my.oschina.net/innovation/blog/150099...

视频直播网站开发流程/如何提高网站排名seo

1、转换图片格式要用到一个叫做ImageMagick的软件&#xff0c;安装后&#xff0c;进入控制台(运行-->cmd)&#xff0c;进入图片所在目录&#xff0c;以a.bmp文件为例&#xff0c;convert a.bmp fig1.eps2、编辑.tex文件加入包\usepackage{graphicx}\usepackage{float}插入图…...