C++之装饰器&适配器模式

突破编程_C++_设计模式(装饰器模式) C++ 设计模式:装饰器模式 阅读详情

目录

一、装饰器模式

模式思想

模式简介

模式优点

模式缺点

代码实现

情景模拟

代码实现

运行结果

二、适配器模式

模式简介

介绍

优点

缺点

代码实现

情景模拟


一、装饰器模式

模式思想

模式简介

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。
这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

意图:

动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
何时使用:
在不想增加很多子类的情况下扩展类。
如何解决:
将具体功能职责划分,同时继承装饰器模式

模式优点

装饰类和被装饰类可以独立发展,不会相互耦合,装饰器模式是继承的一个替代模式,装饰器模式可以动态地扩展实现一个类的功能。

模式缺点

多层装饰比较复杂。

代码实现

情景模拟

我们还是拿汽车来举例子吧。
现在的汽车越来越智能化了,什么定速巡航、自动刹车、车道偏离等功能都逐渐进入我们的生活,为我们带来了更为便利的出行。

假设上述提到的定速巡航、自动刹车、车道偏离三个功能就是我们想要为汽车装饰的功能,汽车默认的功能配置有:基本配置。

得到具体的汽车(宝马、奥迪、奔驰)后,我们可以选择性地增加装饰功能。

代码实现

具体实现如下:


//抽象基类
class Car
{
public:
	virtual void show() = 0;
};

//三个实体的基类
class Bmw : public Car
{
public:
	void show()
	{
		cout << "这是一辆宝马汽车,配置有:基本配置";
	}
};
class Audi : public Car
{
public:
	void show()
	{
		cout << "这是一辆奥迪汽车,配置有:基本配置";
	}
};
class Benz : public Car
{
public:
	void show()
	{
		cout << "这是一辆奔驰汽车,配置有:基本配置";
	}
};

//装饰器的基类
class CarDecorator : public Car
{
public:
	CarDecorator(Car* p):pCar(p)
	{}
private:
	Car* pCar;
};

//装饰器1 :定速巡航
class ConcreateDecorator1 : public Car
{
public:
	ConcreateDecorator1(Car* p):pCar(p)
	{}
	void show()
	{
		pCar->show();
		cout << "定速巡航功能,";
	}
private:
	Car* pCar;
};
//装饰器2 :自动刹车
class ConcreateDecorator2 : public Car
{
public:
	ConcreateDecorator2(Car* p) :pCar(p)
	{}
	void show()
	{
		pCar->show();
		cout << "自动刹车";
	}
private:
	Car* pCar;
};
//装饰器3 :车道偏离
class ConcreateDecorator3 : public Car
{
public:
	ConcreateDecorator3(Car* p) :pCar(p)
	{}
	void show()
	{
		pCar->show();
		cout << "车道偏离";
	}
private:
	Car* pCar;
};

运行结果

接着我们可以使用如下代码:

void main()
{
	Car* p1 = new ConcreateDecorator1(new Bmw());
	p1 = new ConcreateDecorator2(p1);
	p1->show();
	cout << endl;

	Car* p2 = new ConcreateDecorator2(new Audi());
	p2->show();
	cout << endl;

	Car* p3 = new ConcreateDecorator3(new Benz());
	p3->show();
	cout << endl;
}

可以看到,我们在运行代码中:
给宝马汽车增加了Decorator01(定速巡航)、Decorator02(自动刹车)、Decorator03(车道偏离)的配置;
给奥迪汽车增加了Decorator02(自动刹车)配置;
给奔驰汽车增加了Decorator03(车道偏离)配置。

二、适配器模式

模式简介

介绍

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。

这种类型的设计模式属于结构型模式。

意图:
将一个类的接口转换成为客户希望的另一个接口。
适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
主要解决:
主要解决在软件系统中,常常要将一些“现存的对象”放到新环境中,而新环境的接口是现有对象不能满足的。

优点

  1. 可以让任何两个没有关联的类一起工作;
  2. 提高了类的复用;
  3. 增加了类的透明度;
  4. 灵活性好。

缺点

过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。

代码实现

情景模拟

同样的,我们来模拟这么一个场景:

我们要安装一个投影仪:能够将电脑上的画面投影出来,对于投影仪来说,常见的接口有:VGA、HTMI接口,但是对于不同的电脑,接口一定是固定的,一个电脑必然只有一种接口,我们往往会出现接口不适配的情况。

我们就来模拟不兼容的两个接口:VGA和HDMI之间,如何通过一个适配器adapter连接在一起工作的。

当我们的电脑是VGA接口的时候,我们很自然能连接VGA的投影仪,但是当我们想要去连接HTMI的投影仪时,问题必然就出现了。

 我们可以添加一个适配器类:

/*
适配器模式:让不兼容的接口可以在一起工作

VGA接口的电脑,投影仪也是VGA接口
*/

//VGA接口类
class VGA
{
public:
	virtual void play() = 0;
};

//表示支持VGA接口的投影仪
class TV1 :public VGA
{
public:
	void play()
	{
		cout << "通过VGA接口连接投影仪,进行视频播放 " << endl;
	}
};

//实现一个电脑类(只支持VGA接口)
class Computer
{
public:
	//由于电脑支持VGA接口,所以该方法的参数智能支持VGA即可的指针/引用
	void playVideo(VGA* pVGA)
	{
		pVGA->play();
	}
};
/*
方法1:换一个支持HDMI接口的电脑,这个就叫代码重构
方法2:买一个转换头(适配器),能够把VGA信号转换成?HDMI信号,这个叫添加适配器类

*/

//进了一批新的投影仪,但是新的投影仪都是只支持HDMI接口
//HDMI接口类
class HDMI
{
public:
	virtual void play() = 0;
};
//表示支持HDMI接口的投影仪
class TV2 :public HDMI
{
public:
	void play()
	{
		cout << "通过HTMI接口连接投影仪,进行视频播放 " << endl;
	}
};

//由于电脑(VGA接口)和投影仪(HTMI接口)无法直接相连,所以需要添加适配器类
class VGATOHDMI :public VGA
{
public:
	VGATOHDMI(HDMI* p) :pHdmi(p)
	{
	}
	void play()//该方法相当于就是转换头,做不同接口的信号转换
	{
		pHdmi->play();
	}
private:
	HDMI* pHdmi;
};

运行一下:

void main()
{
	Computer cc;
	cc.playVideo(new TV1());
	
	cc.playVideo(new VGATOHDMI(new TV2()));
	
}

结果:

 

C++结构型模式-装饰模式 C++实现装饰器模式 阅读详情

相关推荐

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

装饰器模式(DECRATOR): 为了实现动态的给对象添加职能,即从外部给对象添加相关职能。可以这样理解,比如说一个Person类,该类的操作有能吃、能睡、能跑、但假如随着人类的进化,某一天Person能飞了,能在水里游了等等,按照一般的写法是修改Person这个类,给这个类添加上能飞,能游等操作,但是这样破坏了面向对象的开放-封闭原则(对修改封闭,对拓展开发,有兴趣的可以查看相关文献),且随着人...

michael_xh的博客 350

C++设计模式——装饰器模式

装饰器设计模式其本质上还是使用多态的原理,提供了一种可扩展功能的设计模式。

肩上风骋的博客 1582

C++设计模式——Decorator装饰器模式

C++设计模式入门

程序员与背包客_CoderZ 1650

C++软件设计模式之装饰器模式

首先,我们定义一个抽象接口,该接口包含一个sendText方法,用于表示文本传输的基本行为。public:装饰器抽象类也继承自,并且持有一个类型的引用或指针,用于装饰的具体对象。protected:public:装饰器模式主要用于扩展对象的功能,通过组合而不是继承来实现动态的行为变化。策略模式主要用于在运行时选择不同的算法或行为,通过策略对象的互换来实现行为的变化。Visitor模式主要用于在不改变对象结构的前提下为对象结构中的多个元素添加新的操作,通过访问者对象来实现新的行为。

捕鲸叉的专栏 1661

44、装饰器与适配器模式:C++ 中的灵活设计实践

本文深入探讨了C++中的装饰器模式与适配器模式,分析了它们的设计原理、实现方式及实际应用场景。文章首先介绍了装饰器模式的基础实现与局限性,并展示了如何通过模板和完美转发构建通用、可组合的装饰器;随后引出适配器模式,解决接口不匹配问题,特别是在线程安全队列等场景中的应用。通过对比两种模式的特点与适用场景,帮助开发者在实际项目中做出合理选择,提升代码的灵活性与可维护性。

day7的博客 70

C++ 设计模式6:适配器模式

什么是适配器模式? 适配器它是主要作用是将一个类的接口转换成客户希望的另外一个接口这样使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 适配器模式有两种:1.类的适配器 2.对象适配器,对象适配器更多一些。 代码示例 #include &lt;iostream&gt; using namespace std; //目标接口 class CTarget { public: CTarget() {} virtual ~CTarget() {} vi...

琅嬛福地 714

【重走编程路】设计模式概述(五) -- 适配器模式、装饰器模式

适配器模式通过引入一个适配器充当中间人的方式,将其中一个对象转换成能够与另一个对象兼容的新的对象,使得两个不兼容的对象可以协同工作。装饰器模式通过创建一个装饰类来包装原始类,提供了一种在运行时动态地为对象添加新功能的方法。

weixin_44595767的博客 1259

45、C++ 适配器模式详解

本文深入探讨了C++中的适配器模式,涵盖函数适配器、std::bind、编译时适配器等多种实现方式,并通过丰富示例展示了其在多线程安全、接口转换、模板参数匹配等场景的应用。文章还比较了不同适配方式的优缺点,分析了模板别名的局限性,并介绍了适配器与装饰器模式的结合使用,帮助开发者提升代码灵活性与可维护性。

day7的博客 109

适配器模式——C++实现

一种。适配器模式的定义:适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不可兼容的类可以合作无间。简而言之,适配器模式可以将一种接口转换成我们想要的形式。举个例子,家用插座的供电时220V交流电,而普通手机的充电口需要的是5V的直流电。它们俩的接口不同,所以不可以通过导线直接连接起来给手机充电。我们平时使用的手机充电器它的正式名称是电源适配器,电源适配器通过一系列的转换,将220V交流电转换成手机所需要的5V直流电。

T_killer_的博客 595

如何在现代C ++中编写装饰器函数-C/C++开发

类似于C ++ Python的装饰器如何在现代C ++ 14或更高版本中编写装饰器函数跨MSVC,GNU CC和Clang编译器的作品跳过本教程,并查看最终结果教程演示实用演示编译C ++类似于Python的装饰器如何编写装饰器现代C ++ 14或更高版本中的函数跨MSVC,GNU CC和Clang编译器的作品跳过本教程并查看最终结果教程演示实用演示编译时修饰器演示运行时成员函数演示可重用成员函数演示目标Python具有一个不错的功能,它允许功能定义被其他现有功能包装。 &ldquo;包装&rdquo;包括将一个函数作为参数并返回一个新的聚合

Cesium实战:5分钟搞定离线地图与地形加载(附避坑指南)

本文详细介绍了Cesium在内网环境下的离线部署实战方案,重点解决了影像与地形数据的本地加载问题。通过逐步指导项目配置、本地瓦片与自定义地形数据的处理,并优化相机控制体验,帮助开发者快速构建安全、高效的三维地球应用,避免常见的401错误与加载失败陷阱。

weixin_30632089的博客 281

13.装饰器,桥接和适配器模式的异同

介绍前面几篇文章分别介绍了装饰器模式,桥接模式和适配器模式这三种设计模式。这三种设计模式,从设计思想角度上看是非常相似的。三者都是结构型的设计模式,而且都存在依赖抽象的情况。但是三者之间却又存在一些微妙的区别,这也是本文重点关注的内容。适配器模式该模式重点强调的是适配的功能。该模式的关键点是:·        主体类和适配器类实现相同的接口A·        主体类依赖适配器类·        适...

郑学炜的技术博客 1020

AS7341光谱传感器实战:I2C驱动、Arduino与Python代码及校准指南

光谱传感器通过多通道滤光片与光电二极管阵列,将光信号转换为数字量,实现波长级测量。其技术价值在于以低成本替代传统光谱仪,完成颜色识别、光源分析等任务。在植物补光、水质检测等场景中,多通道光谱数据能精准区分红光与深红光比例。AS7341作为9通道(8可见光+1近红外)I2C传感器,支持Arduino、ESP32和树莓派,结合增益与积分时间调节,可适应强弱光环境。本文从芯片原理出发,详解寄存器配置、双平台代码实现、暗电流与白板校准方法,并给出常见问题排查指南,帮助创客快速构建光谱应用。

weixin_42519733的博客 252

5.适配器模式C++用法示例

为了解决这个问题,创建了一个类适配器ClassAdapter,它同时继承了目标接口和适配者类,同时实现了目标接口中的方法,在该方法中调用了适配者类中的方法specificRequest()。总的来说,如果可以修改被适配类的代码,并且不需要支持所有的被适配类接口,那么对象适配器模式是一个更加灵活和可扩展的选择。但是如果不能修改被适配类的代码,并且需要支持所有的被适配类接口,那么类适配器模式是一个更加合适的选择。适配器模式的原理是将一个类的接口转换成客户希望的另一个接口。

lzq8090的博客 788

LLC谐振变换器设计实战:从工作原理到参数设计与调试

开关电源设计是电力电子领域的核心技术,其核心目标在于提升效率与功率密度。为实现这一目标,软开关技术应运而生,它通过精心控制开关器件的电压与电流波形,使其在开通或关断瞬间实现零电压或零电流切换,从而从根本上降低开关损耗。LLC谐振变换器正是这一技术的杰出代表,它通过引入谐振网络,巧妙地实现了主开关管的零电压开关和次级整流管的零电流开关。这种拓扑结构在服务器电源、通信设备及高端显示驱动等要求高效率、高功率密度的应用场景中价值显著。本文将以半桥LLC为例,深入剖析其工作模态与增益特性,并系统阐述其参数设计、仿真验

weixin_34129696的博客 561

用 Docker 一键部署 SillyTavern酒馆 mac/windows/linux通用教程,我再也不手动折腾了!

本文介绍了如何使用 Docker 一键部署 SillyTavern 项目,适用于 Mac、Windows 和 Linux 系统。SillyTavern 是一个本地部署的大语言模型聊天界面,支持多种插件和扩展。文章详细说明了安装 Docker、拉取项目、启动容器、配置白名单、启用插件等步骤,并提供了常见问题的解决方法。通过 Docker 部署,用户可以避免繁琐的手动配置,快速搭建和运行 SillyTavern,适合希望简化部署流程的用户。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2622

【CPP】一文带你掌握CPP设计模式

设计模式是软件开发中用于解决常见问题的经典解决方案。它们是由经验丰富的开发者总结出来的最佳实践,能够提高代码的可维护性、可扩展性和可复用性。设计模式是软件开发中的经典解决方案,能够提高代码的可维护性、可扩展性和可复用性。通过掌握常见的设计模式,开发者可以更好地组织代码结构,解决复杂问题。理解模式的核心思想:每个设计模式都有其独特的应用场景和解决问题的方式。灵活运用:在实际开发中,根据具体需求选择合适的设计模式。避免过度设计:设计模式是工具,而不是目标,避免为了使用模式而增加不必要的复杂性。

Ape's IT Blog 948

【Halcon 】Halcon 实战:如何为 XLD 模板添加极性信息以提升匹配精度?

本文介绍了Halcon中为XLD轮廓模板添加极性信息的实用技巧。通过先以&quot;ignore_local_polarity&quot;模式创建模板,首次匹配获得位置后,使用set_shape_model_metric运算符结合真实图像为模板注入极性信息(边缘明暗方向)。这种方法弥补了XLD模板初始不支持极性的缺陷,可显著提升后续匹配的精度和抗干扰能力。实验显示,添加极性信息后的模板匹配效果明显优于无极性的匹配结果。该技术特别适用于基于手动绘制或处理后的XLD轮廓创建模板的场景。

songhuangong123的博客 750

【C++设计模式】第五篇:装饰器模式

【C++设计模式】【C++设计模式】【C++设计模式】【C++设计模式】第五篇:装饰器模式。

宁静致远的博客 908

面向口齿不清者的语音识别新突破:用大模型拯救“听不懂”的声音

面向构音障碍患者的语音识别新突破:大语言模型显著提升识别准确率 国际语音研究团队在Interspeech 2025发表最新成果,通过将大语言模型(LLM)融入语音识别系统,显著改善了对构音障碍(dysarthria)患者语音的识别效果。研究表明: 传统语音识别(如CTC模型)对构音障碍语音的词错误率(WER)高达50-54%,Whisper模型降至38-40%。 引入LLM解码器后,BART模型将WER降至30-32%,而Whisper-Vicuna组合更将WER降低至21-26%。 关键优势:LLM能有效

帅小柏的博客 270

储能电池管理系统介绍(一)

介绍储能BMS的架构以及各模块功能

manjixingkong1234的专栏 1916

设计模式之装饰器模式

使用装饰器模式的好处:1)可以在运行时动态的添加或删除功能。2)可以递归地组合多个装饰器,从而创建复杂的对象。3)可以使用不同的装饰器组合来创建不同的行为。4)可以在不修改原有代码的情况下增加新功能。总体来说,装饰器模式是一种强大且灵活的设计模式,它可以用于创建可扩展、可定制和可组合的对象。

红军不怕远征难,万水千山只等闲 1733

补丁1.0:使用Eviews做ADF检验

补丁1.0:使用Eviews做ADF检验

Jet4505的博客 1961

设计模式【cpp实现版本】

单例模式是一种设计模式,确保一个类只有一个实例,并提供全局访问点。常见的实现方式包括饿汉式和懒汉式。饿汉式在程序启动时即创建实例,线程安全但可能浪费资源;懒汉式在首次使用时创建实例,需考虑线程安全问题,可通过加锁或静态局部变量实现。工厂模式则用于封装对象的创建过程,分为简单工厂、工厂方法和抽象工厂。简单工厂通过一个工厂类创建多种产品,但扩展性差;工厂方法为每种产品提供一个工厂类,扩展性好;抽象工厂则用于创建一系列相关产品,适合产品簇的场景。这些设计模式有助于提高代码的可维护性和扩展性。

qq_55317476的博客 1154

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

适配器模式和装饰器模式

最近在学习java基础类库的io包,见:http://student.youkuaiyun.com/space.php?uid=37718&do=blog&id=1684 在分析类层次结构的过程中,发现了适配器模式和装饰器模式。google后学习并在这里跟大家分享一下。 适配器模式(Adapter) 在学习UML这门课的时候,老师有简单地提到过适配器模式,在我的印象中,适配器模式一直是这样的: 如

If 582

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

设计模式(结构型) -- 适配器模式,代理模式,装饰器模式

 定义:将一个类的接口转换为客户希望的另一个接口,使得原本由于接口不兼容而不能在一起工作的那些类可以一起工作。 例如,我们使用for_each()来遍历数组 class MyPrint { public: void operator()(int v1, int v2){ cout &lt;&lt; v1 + v2 &lt;&lt; endl; } }; int main() { vector&lt;int&gt; v; for (int i = 0; i &lt; 10; i++) v.pu

weixin_43688483的博客 268

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

上一篇: C++之代理模式
下一篇: Redis---缓存双写一致性
Flying  clouds
博客等级 码龄5年 557粉丝 81原创
评论 16
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值