C++适配器模式的实现及应用
Posted Redamanc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++适配器模式的实现及应用相关的知识,希望对你有一定的参考价值。
模式简介
介绍
适配器模式(Adapter Pattern
)是作为两个不兼容的接口之间的桥梁。
这种类型的设计模式属于结构型模式。
意图:
将一个类的接口转换成为客户希望的另一个接口。
适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
主要解决:
主要解决在软件系统中,常常要将一些“现存的对象”放到新环境中,而新环境的接口是现有对象不能满足的。
优点
- 可以让任何两个没有关联的类一起工作;
- 提高了类的复用;
- 增加了类的透明度;
- 灵活性好。
缺点
过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
代码实现
情景模拟
同样的,我们来模拟这么一个场景:
不知道大家有没有自己心目中的小屋,上图就是博主心目中理想的小窝了 😃。
抛开其他的不谈,我们可以看到上图中的电脑区域有4个显示屏,这无疑是我们程序员的梦寐以求!!!
回到现实,如何将4个显示屏连接在一起,显示同一个主机电脑的内容呢?
相信有懂哥可以脱口而出:VGA
、HDMI
等接口。
只要有了这些接口,我们就可以将所有的显示器连在一起了!同样的,还可以连接投影仪。
投影仪可能在生活中使用的更多、更广泛吧!
我们就来模拟不兼容的两个接口:VGA
和HDMI
之间,如何通过一个适配器adapter
连接在一起工作的。
首先是有VGA
和HDMI
接口以及对应的派生类;
接着需要一个电脑computer
类来作为视频播放的媒介,但是这个电脑比较老,只有VGA
的接口;
本来公司中开会使用的投影仪设施也比较陈旧,支持VGA
接口,这样,电脑和投影仪的接口是匹配的。就可以正常的进行投影播放。
但是,公司新进了一批设备,包含了新的投影仪,支持HDMI
接口,这一下,和电脑的VGA
接口就不兼容了。
需要设计一个适配器,来完成相应的工作。
代码
class VGA
{
public:
virtual void play() = 0;
};
class TV01 :public VGA
{
public:
void play()
{
cout << "通过VGA接口连接投影仪,进行视频播放" << endl;
}
};
class Computer
{
public:
void playVideo(VGA* pVGA)
{
pVGA->play();
}
};
class HDMI
{
public:
virtual void play() = 0;
};
class TV02 :public HDMI
{
public:
void play()
{
cout << "通过HDMI接口连接投影仪,进行视频播放" << endl;
}
};
class VGAtoHDMIAdapter :public VGA
{
public:
VGAtoHDMIAdapter(HDMI* p) :pHdmi(p) {}
void play()
{
pHdmi->play();
}
private:
HDMI* pHdmi;
};
运行结果
首先是VGA
的投影仪和VGA
的电脑:
int main()
{
Computer com;
com.playVideo(new TV01());
return 0;
}
运行结果如下:
我们看到接口匹配的时候,是可以正常工作的。
接下来是HDMI
接口的投影仪和VGA
接口的电脑:
int main()
{
Computer com;
com.playVideo(new TV02());
return 0;
}
运行结果如下:
我们可以看到,编译器给我们报错了,提示说:
无法将参数 1 从“TV02 *”转换为“VGA *”
;
这就说明了接口不匹配的时候,直接使用,是会出错的。
接下来为了使用新的设备,我们使用适配器:
int main()
{
Computer com;
com.playVideo(new VGAtoHDMIAdapter(new TV02()));
return 0;
}
运行结果如下:
参考资料
【1】适配器模式 | 菜鸟教程
以上是关于C++适配器模式的实现及应用的主要内容,如果未能解决你的问题,请参考以下文章
C++初阶:STL —— stack and queuestack/queue的介绍及使用 | stack/queue/priority_queue的深度剖析及模拟实现 | 适配器模式 | 仿函数
C++初阶:STL —— stack and queuestack/queue的介绍及使用 | stack/queue/priority_queue的深度剖析及模拟实现 | 适配器模式 | 仿函数
C++初阶:STL —— stack and queuestack/queue的介绍及使用 | stack/queue/priority_queue的深度剖析及模拟实现 | 适配器模式 | 仿函数