装饰者模式

C++ 装饰者模式解析 装饰者模式指的是动态的将责任附加到对象上,想要扩展其功能,装饰者提供有别于继承的另一种选择。(参考《Head First 设计模式》) 个人理解:装饰者就是一种类包类 就是在构造函数里面,添加类作为参数。 装饰者模式原则 封装变化 多用组合,少用继承 针对接口编程,不针对实质编程 为交互对象的松耦合设计而努力 对扩展开放,对修改关闭 装饰者模式实例 例如男生和女生可以被认为是被装饰... 阅读详情

定义:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活

类型:结构型模式

类图:

 

四大组件:

1、抽象组件类Component,这个类可以是抽象类或者是接口类(建议抽象类),它为子类提供了行为的标准接口,子类根据自身情况实现自己的行为,这里将要发的继承并不是为了继承行为,而是为了使具体组件(被装饰)与装饰者的类型相互匹配,所以通过继承的方式,利用赋值兼容性原则来达到类型的匹配

2、具体组件类ConcreteComponent,被装饰类,这个类的对象将会被装饰者类动态的添加职责

3、抽象装饰者类Decorator,这个类可以是抽象类或者是接口类,但最好是抽象类,并在这个类中持有Component指针或引用,这样的话,当扩展新的具体装饰者类时,会减少很多工作量

4、具体装饰者类ConcreteDecorator,按自身的特点实现类中定义的行为标准接口,并按需求添加适合自身特点的属性,这些属性与行为将来会给具体组件类ConcreteComponent带去新的职责

 

实现代码:

 

#include <iostream>
#include <string>

class Car
{
public:
	virtual void Show() = 0;
	virtual ~Car(){};
};


class Impreza : public Car
{
private:
	std::string CarName;
public:
	explicit Impreza() : CarName(" impreza ")
	{
	}
	void Show()
	{
		std::cout << CarName << std::endl;
	}
};

class Decorator : public Car
{
protected:
	Car *car;
public:
	explicit Decorator(Car *car) : car(car)
	{
	}
	virtual ~Decorator(){};
};

class Decals : public Decorator
{
private:
	std::string color;
public:
	Decals(Car *car, std::string color) : Decorator(car), color(color)
	{
	}
	void Show()
	{
		std::cout << color << " Decals, ";
		if( NULL != car )
		{
			car->Show();
		}
	}
};


class BodyKit : public Decorator
{
public:
	explicit BodyKit(Car * car) : Decorator(car)
	{
	}
	void Show()
	{
		std::cout << " Body Kit, ";
		if( NULL != car )
		{
			car->Show();
		}
	}
};

class Empennage : public Decorator
{
private:
	int *Len;
public:
	Empennage(Car *car, int len) : Decorator(car)
	{
		Len = new int(len);
	}
	void Show()
	{
		std::cout << *Len << " meters Empennage,";
		if( NULL != car )
		{
			car->Show();
		}
	}
	~Empennage()	//装饰者与被装饰者是独立的,装饰者仅需要销毁自己就好了,不应该有销毁被装饰对象的能力
	{
		delete Len;
		std::cout << "Demount Empennage" << std::endl;
	}
};

int main(int argc, char *argv[])
{
	Car *car = new Impreza();

	car->Show();

	Decorator *decorator1 = new Decals(car, "Read");
	Decorator *decorator2 = new BodyKit(decorator1);
	Decorator *decorator3 = new Empennage(decorator2, 2);
	
	decorator3->Show();

	delete decorator3;
	delete decorator2;
	delete decorator1;
	delete car;

	system("pause");
	return 0;
}


 

为了delete父类指针时能顺利析构子类部分,我们应该把父类的析构函数定义为virtual的,也就是说在这里类Component的析构函数应该是virtual的,如果其还要是接口类的话,为满足接口类定义,我们还必须将virtual的析构函数声明为纯虚函数,但这还没完,由于析构函数工作时的特殊性,我们必须还要为其定义一份实现,即使这个实现是空的,否则连接器会报错。于是我们还得为它提供一份空实现。这真的是比较麻烦的事情,所以使用抽象类会更好一些(对装饰者类来说,这个还不够明显,对之前我们说到的工厂模式来说,将基类的析构函数定义为virtual就很有必要了)

 

优缺点:

优点:

1、使用装饰者来扩展职责比起继承来有更多的灵活性

2、不改变源码的情况下就可以动态的扩展对象

缺点:

1、会导致设计许多小类被设计出来,增加了程序的复杂度

2、在同一对象上使用过多装饰者会造成性能的

 

适用场景:

1、在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

2、需要动态地给一个对象增加功能,这些功能也可以动态地被撤销。

3、当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时

 

C++中接口类的标准定义

1、类中不含任何成员变量

2、所有成员函数都是公有的

3、所有成员函数都是纯虚函数

 

 

 

 

麒麟V10服务器多硬盘安装与分区实战:告别自动分区,手动分配/boot、swap和/根目录 本文详细介绍了麒麟V10服务器在多硬盘环境下的手动分区策略,包括/boot、swap和/根目录的优化分配方案。通过SSD与HDD混合存储架构的合理规划,提升系统性能和运维效率,适用于企业级定制化系统部署需求。 阅读详情

相关推荐

AR Tag 与 ROS:从基础部署到机器人视觉定位实战

本文详细介绍了AR Tag技术在ROS环境下的部署与应用,涵盖从基础原理到机器人视觉定位的实战技巧。通过分析AR Tag的特征提取、位姿解算等核心技术,结合ROS工具包`ar_track_alvar`的配置优化,帮助开发者实现高精度的视觉定位系统。文章还分享了深度相机配置、坐标转换及性能优化等实用经验,适用于仓储机器人、物流分拣等场景。

weixin_33146151的博客 181

装饰者模式(Decorator Pattern)(一):装饰者模式介绍

一、意图 装饰者模式(又称装饰模式、包装(Wrapper)模式):动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。 二、适用性 以下情况使用Decorator模式(摘自《设计模式》): • 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 • 处理那些可以撤消的职责。 • 当不能采用生成子类的方法进行扩充时。

jialinqiang的专栏 4241

当FPGA遇上Codesys:用Verilog实现ModbusTCP协议栈的3种方法(Xilinx/Vivado实测)

本文详细介绍了在Xilinx FPGA上使用Verilog实现Modbus TCP协议栈的三种方法,并与Codesys环境无缝集成。从基础架构设计到纯Verilog实现、基于AXI总线的混合方案,再到与Codesys的集成方法,为开发者提供了完整的工业自动化通信解决方案。通过实测数据对比,帮助开发者选择最优实现方案。

weixin_29172963的博客 522

装饰者模式(C++实现)

想要扩展功能,装饰者提供了有别于继承的另外一种选择。      装饰者模式主要实现的功能是动态的给某一个类添加一些额外的功能,它是一个锦上添花者。想要扩展功能,装饰者提供了有别于继承的另外一种选择。设计模式的原则是多用组合少用继承。   uml 图:   特点:      1. 装饰者和被装饰者拥有相同的超类型(可能是抽象类也可能是接口)      2. 可以用多个装饰类来包装一个对...

ylwdi的专栏 797

STM32 SAES硬件加密协处理器全模式工程实践指南

AES(高级加密标准)是嵌入式系统中最基础且关键的对称密码算法,其硬件加速实现直接影响安全、性能与功耗平衡。Secure AES Coprocessor(SAES)作为STMicroelectronics在STM32U5等高安全MCU中集成的专用密码协处理器,不仅支持标准ECB/CBC/CTR模式,更原生兼容GCM和CCM等认证加密模式,具备抗侧信道、密钥保护与DMA卸载能力。理解其寄存器状态机(CHMOD/MODE/CPHASE)、NPBLB数据对齐机制及GCM四阶段编程范式,是规避Tag校验失败、IV错

weixin_42311427的博客 76

2025 华为OD机试真题e卷 C语言 实现【竖直四子棋】

竖直四子棋的棋盘是竖立起来的,双方轮流选择棋盘的一列下子,棋子因重力落到棋盘底部或者其他棋子之上,当一列的棋子放满时,无法再在这列上下子。

MISAYAONE的博客 1417

最常用的设计模式---装饰者模式(C++实现)

最常用的设计模式---适配器模式(C++实现)

黄花寒 7250

STM32cubemx配置驱动DHT11模块

本篇文章将带大家学习使用DHT11湿温度模块,使用这个模块可以获取当前的温度和湿度数据。DHT11可以用于智能家居,蔬菜大棚等项目当中适用范围广。DHT11 是一种数字式温湿度传感器,由杜邦公司推出。它可以测量环境中的温度和湿度,并将测量结果以数字形式传输给微控制器或其他电子设备,适用于通过数字信号读取环境温湿度的应用场景。DHT11 传感器使用单总线数据交换协议,可以通过一个 I/O 引脚进行控制和数据传输。

m0_49476241的博客 5912

什么是装饰者模式?

一、 什么是装饰者模式 装饰者模式又称包装模式,是指不改变原有对象的基础上,将功能附加到对象上,提供了比继承更有弹性的替代方案.属于结构型设计模式. 二、装饰者模式uml图 装饰器其中包含4个角色: 抽象组件(Component): 可以是一个接口或者抽象类,规定了被装饰者的行为. 具体组件(ConcreteComponent): 实现或继承(component)的一个具体对象.也即被装饰者....

weixin_40980639的博客 2369

12.工具高级参数CogCalibNPointToNPointTool

CogCalibNPointToNPointTool是一种多点2D坐标校正工具,用于将图像像素坐标转换为物理世界坐标。该工具通过两组点(图像坐标点和物理坐标点)计算最佳转换关系,并将结果保存供后续使用。操作步骤包括获取图像、添加坐标点对、计算转换参数。校正结果会显示平移、缩放、旋转等参数及RMS误差值,较大的误差可能表明点位置不准确或自由度不足。该工具广泛应用于机器视觉领域,通过9点标定等案例可验证坐标转换的准确性并优化参数设置。

204

【ACP】2025-最新-疑难题解析- 练习一汇总

他们对您的方案比较满意,作为一个特别看重用户体验的创业公司,他们有一个比较担心的问题:在后端云服务器 ECS 实例相对空闲时,可能会触发减少 ECS 实例的伸缩活动,这时候运行在即将移出伸缩组的 ECS 实例上的应用会被终止,那么发起这些应用的用户的体验会变差。:在使用阿里云的负载均衡 SLB 实例时,做了如下健康检查的配置:响应超时时间为 5 秒,健康检查间隔为 2 秒,不健康阈值为 3,健康阈值为 3,即对于确认一个后端服务器 ECS 实例是健康的,需要连续三次得到正常响应。以下说法哪一项是正确的?

jundao1997的专栏 326

装饰者模式及实例

带你了解装饰者模式,以及装饰者模式和集成以及代理模式的区别,同时还有简单的实例。

SSL 的博客 1961

RT-DETR算法优化改进:DCNv4更快收敛、更高速度、更高性能,效果秒杀DCNv3、DCNv2等 ,助力检测

DCNv4更快收敛、更高速度、更高性能,完美和RT-DETR结合,助力涨点

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1323

掌握设计模式之装饰者模式

掌握设计模式之装饰者模式

one的博客 907

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

上一篇: C++复习之const限定符
下一篇: C++重载箭头操作符的理解
早起的虫儿灬
博客等级 码龄10年 54粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值