1.概念
适配器模式是一种结构型的软件设计模式,也称包装模式,即将相对复杂的功能(可能用到多个类)封装起来,提供一个使用者想要的接口,使用者只需要调用接口,不需要知道接口里封装的内容是如何实现的。比如在面对一些第三方库或者SDK开发时,它们的接口往往与我们自己想要的接口不一致,此时适配器模式可以很好地扮演一个接口转换器的角色,将别人的接口与我们的接口对应上。
2.优缺点
优点:
- 良好封装性。接口内的内容对使用者而言是透明的,即看不见,这确保了内部功能具备较好的封装性,不易被改动。
- 解耦。不匹配的两方在适配器的作用下可以做到解耦,不需要修改任何一方原有代码逻辑。
- 良好复用性。适配的两方不需要做任何修改,业务的实现可以通过适配器来完成,不同的业务可以使用不同的适配器。
- 良好扩展性。若要增加业务场景,只需要增加适配器类,来满足业务即可。
缺点:
- 不利于维护。因为业务的实现基于适配器完成,适配器中代码的复杂程度会越来越高,不熟悉业务或者底层逻辑的人难以短时间内接手维护。
- 系统结构易混乱。当业务量快速增加时,适配器类的数量也会快速增加,没有良好的系统架构布局,最终会使得整个系统臃肿且危险。
3.两种适配器类型
- 类适配器模式:适配器类通过继承适配者类(多重继承),达到适配目的,部分语言可能不支持多重继承(如C#)。
- 对象适配器模式:适配器类中存放适配者类的实例对象,调用它来达到适配目的,该模式较常用。
4.示例代码
4.1 类适配器模式
#pragma once
#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();}
};int main()
{Camera* m_camera = new CameraAdapter();// 打开相机m_camera->openCamera();// 配置相机m_camera->setConfig();// 关闭相机m_camera->closeCamera();delete m_camera;return 0;
}
Camera类的接口使我们实际想要的接口,但是事实上我们拿到的现有的接口BaslerCamera类提供的接口,因此需要CameraAdapter作为类适配器,它同时继承自Camera和BaslerCamera两个类。
4.2 对象类适配器模式
#pragma once
#include <iostream>
#include "BaslerCamera.h"using namespace std;// 相机接口类
class Camera
{
public:// 构造函数Camera() {};// 析构函数virtual ~Camera() {};// 打开相机virtual void openCamera() = 0;// 关闭相机virtual void closeCamera() = 0;// 配置属性virtual void setConfig() = 0;
};// 相机适配器类
class CameraAdapter :public Camera
{
public:// 构造函数CameraAdapter() {m_baslerCamera = new BaslerCamera();}// 析构函数virtual ~CameraAdapter() {if (m_baslerCamera != nullptr) {delete m_baslerCamera;m_baslerCamera = nullptr;}}// 打开相机virtual void openCamera() {m_baslerCamera->openBaslerCamera();}// 关闭相机virtual void closeCamera() {m_baslerCamera->closeBaslerCamera();}// 配置属性virtual void setConfig() {// 打开曝光设置m_baslerCamera->openExposureSettings();// 更改相机帧率m_baslerCamera->changeCameraFrame();}
private:BaslerCamera *m_baslerCamera; // 适配者类实例
};int main()
{Camera* m_camera = new CameraAdapter();// 打开相机m_camera->openCamera();// 配置相机m_camera->setConfig();// 关闭相机m_camera->closeCamera();delete m_camera;return 0;
}
适配器类做了改变,类中增加了一个适配者类的实例对象,调用的结果同类适配器模式一致。
引用
设计模式之适配器模式(C++)_c++适配器模式-CSDN博客