定义
将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
应用场景
- 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象 ”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。
- 如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?
结构
代码示例
//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
//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模式中的‘现存对象”作为新的接口方法参数,来达到适配的目的。