适配器模式(C++)

定义

将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

应用场景

  • 在软件系统中,由于应用环境的变化,常常需要将"一些现存的对象 "放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。
  • 如何应对这种"迁移的变化"?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?

结构

代码示例

cpp 复制代码
//Adapter.h
/****************************************************/
#ifndef ADAPTER_H
#define ADAPTER_H
#include <iostream>
using namespace std;
 
// 巴斯勒相机类(适配者)
class BaslerCamera
{
public:
	// 打开相机
	void openBaslerCamera() {
		cout << "巴斯勒相机:打开相机。" << endl;
	}
	// 关闭相机
	void closeBaslerCamera() {
		cout << "巴斯勒相机:关闭相机。" << endl;
	}
	// 打开曝光设置
	void openExposureSettings() {
		cout << "巴斯勒相机:打开曝光设置。" << endl;
	}
	// 更改相机帧率
	void changeCameraFrame() {
		cout << "巴斯勒相机:更改相机帧率。" << endl;
	}
};

// 相机接口类
class Camera
{
public:
	// 构造函数
	Camera() {};
	// 析构函数
	virtual ~Camera() {};
	// 打开相机
	virtual void openCamera() = 0;
	// 关闭相机
	virtual void closeCamera() = 0;
	// 配置属性
	virtual void setConfig() = 0;
};
 
// 相机适配器类
class CameraAdapter :public Camera, public BaslerCamera
{
public:
	// 打开相机
	virtual void openCamera() {
		openBaslerCamera();
	}
	// 关闭相机
	virtual void closeCamera() {
		closeBaslerCamera();
	}
	// 配置属性
	virtual void setConfig() {
		// 打开曝光设置
		openExposureSettings();
		// 更改相机帧率
		changeCameraFrame();
	}
};

#endif
cpp 复制代码
//test.cpp
/****************************************************/
#include "Adapter.h"
int main()
{
	Camera *m_camera = new CameraAdapter();
	// 打开相机
	m_camera->openCamera();
	// 配置相机
	m_camera->setConfig();
	// 关闭相机
	m_camera->closeCamera();
	delete m_camera;
	
	return 0;
}

运行结果

要点总结

  • Adapter模式主要应用于"希望复用一些现存的类,但是接口又与复用环境要求不一致的情况",在遗留代码复用、类库迁移等方面非常有用。
  • GoF 23定义了两种Adapter模式的实现结构:对象适配器和类适配器。但类适配器采用"多继承"的实现方式,一般不推荐使用。对象适配器采用"对象组合"的方式,更符合松耦合精神。
  • Adapter模式可以实现的非常灵活,不必拘泥于Gof23中定义的两种结构。例如,完全可以将Adapter模式中的'现存对象"作为新的接口方法参数,来达到适配的目的。
相关推荐
君义_noip18 分钟前
CSP-J 2025 入门级 第一轮(初赛) 完善程序(1)
c++·算法·信息学奥赛·csp 第一轮
哭泣方源炼蛊1 小时前
AtCoder Beginner Contest 456 E补题(分层图 + 有向环检测 )
c++·算法·深度优先·图论·拓扑学
Yuk丶2 小时前
UE4 与 UE5:技术差异深度解析
c++·ue5·游戏引擎·ue4·游戏程序·虚幻
故事和你912 小时前
洛谷-数据结构2-1-二叉堆与树状数组1
开发语言·数据结构·c++·算法·动态规划·图论
海参崴-2 小时前
C++ STL篇 红黑树的模拟实现
开发语言·c++
研究点啥好呢2 小时前
Momenta后端开发面试题精选:10道高频考题+答案解析(数据产线方向)
c++·python·面试·求职招聘
Hical613 小时前
C++26 前瞻心得:下一代 C++ 最值得期待的特性
c++
悲伤小伞3 小时前
Linux_传输层协议TCP详解
linux·网络·c++·网络协议·tcp/ip
Frank_refuel3 小时前
C++之STL->string类的使用和实现
java·开发语言·c++
fpcc3 小时前
跟我学C++中级篇—Linux文件读写的分析
linux·c++