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

这篇具有很好参考价值的文章主要介绍了C++之装饰器&适配器模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、装饰器模式

模式思想

模式简介

模式优点

模式缺点

代码实现

情景模拟

代码实现

运行结果

二、适配器模式

模式简介

介绍

优点

缺点

代码实现

情景模拟


一、装饰器模式

模式思想

模式简介

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

意图:

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

模式优点

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

模式缺点

多层装饰比较复杂。

代码实现

情景模拟

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

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

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

C++之装饰器&适配器模式,C++,设计模式,c++,开发语言

代码实现

具体实现如下:


//抽象基类
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(车道偏离)配置。

C++之装饰器&适配器模式,C++,设计模式,c++,开发语言

二、适配器模式

模式简介

介绍

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

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

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

优点

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

缺点

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

代码实现

情景模拟

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

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

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

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

C++之装饰器&适配器模式,C++,设计模式,c++,开发语言

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

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

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++,开发语言

 文章来源地址https://www.toymoban.com/news/detail-537870.html

到了这里,关于C++之装饰器&适配器模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【18】c++设计模式——>适配器模式

    c++的适配器模式是一种结构型设计模式, 他允许将一个类的接口转换成另一个客户端所期望的接口 。适配器模式常用于已存在的,但不符合新需求或者规范的类的适配。 在c++中实现适配器模式时,通常需要一下几个组件: 1.目标接口(Target interface):客户端所期望的接口,

    2024年02月07日
    浏览(48)
  • 设计模式之适配器模式(Adapter)的C++实现

    在软件功能开发中,由于使用环境的改变,之前一些类的旧接口放在新环境的功能模块中不再适用。如何使旧接口能适用于新的环境?适配器可以解决此类问题。适配器模式:通过增加一个适配器类,在适配器接口中做一些适配操作,将旧模块类转换成使用者Client类期望的接

    2024年02月12日
    浏览(46)
  • 《C++新经典设计模式》之第15章 适配器模式

    适配器模式.cpp

    2024年02月03日
    浏览(50)
  • C++之装饰器&适配器模式

    目录 一、装饰器模式 模式思想 模式简介 模式优点 模式缺点 代码实现 情景模拟 代码实现 运行结果 二、适配器模式 模式简介 介绍 优点 缺点 代码实现 情景模拟 模式简介 装饰器模式( Decorator Pattern )允许向一个现有的对象 添加新的功能 ,同时又不改变其结构。 这种类型

    2024年02月13日
    浏览(47)
  • 设计模式--适配器模式

    目录 基本介绍 工作原理 类适配模式 介绍 应用实例介绍 类适配器模式注意事项和细节 对象适配模式 介绍 对象适配器模式注意事项和细节 接口适配器模式 介绍 适配器模式的注意事项和细节  (1) 适配器模式(Adapter Pattern) 将某个类的接口转换成客户端期望的另一个接口表示

    2023年04月26日
    浏览(44)
  • 设计模式-适配器模式

    在我们生活中,插座输出的电源都是220V的,而我们手机充电需要的电压基本都是5V的。我们不能直接用220V的电压来给手机充电,也不能说专门有线路来提供5V的电压。所以就有了充电器,充电器可以将220V的电压转为5V的电压,这样我们就方便太多了。 上面所说的充电器其实就

    2024年02月08日
    浏览(47)
  • 设计模式——适配器模式

    说起适配器其实在我们的生活中是非常常见的,比如:学校的宿舍的电压都比较低,而有的学生想使用大功率电器,宿舍的就会跳闸,然而如果你使用一个适配器(变压器)就可以使用了(温馨提示宿舍使用大功率电器不太安全,容易引起火灾,希望大家谨慎使用)。 又比如

    2024年02月12日
    浏览(59)
  • 【设计模式】适配器模式

    适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。

    2024年02月12日
    浏览(60)
  • 设计模式四:适配器模式

    1、适配器模式的理解 适配器模式可以理解为有两个现成的类Adaptee和Target,它们两个是不能动的,要求必须使用B这个类来实现一个功能,但是A的内容是能复用的,这个时候我们需要编写一个转换器 适配器模式 Adaptee:被适配者,现有的接口或者类; Adapter:适配器类,适配器

    2024年02月22日
    浏览(50)
  • 设计模式 06 适配器模式

    适配器模式(Adapter Pattern)属于 结构型 模式 结构型 模式关注如何将现有的类或对象组织在一起形成更加强大的结构。 在生活中,我们经常遇到这样的一个问题:轻薄笔记本通常只有 type-c 或者 usb-a 接口,没有网口。但日常使用中是往往需要连接网口上网的,这时想到的第

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包