申请建设网站经费申请,百度收录较好的网站,设计公司 网站,网站seo怎么做知乎1.概念 适配器模式是一种结构型的软件设计模式#xff0c;也称包装模式#xff0c;即将相对复杂的功能#xff08;可能用到多个类#xff09;封装起来#xff0c;提供一个使用者想要的接口#xff0c;使用者只需要调用接口#xff0c;不需要知道接口里封装的内容是如何实…1.概念 适配器模式是一种结构型的软件设计模式也称包装模式即将相对复杂的功能可能用到多个类封装起来提供一个使用者想要的接口使用者只需要调用接口不需要知道接口里封装的内容是如何实现的。比如在面对一些第三方库或者SDK开发时它们的接口往往与我们自己想要的接口不一致此时适配器模式可以很好地扮演一个接口转换器的角色将别人的接口与我们的接口对应上。
2.优缺点
优点
良好封装性。接口内的内容对使用者而言是透明的即看不见这确保了内部功能具备较好的封装性不易被改动。解耦。不匹配的两方在适配器的作用下可以做到解耦不需要修改任何一方原有代码逻辑。良好复用性。适配的两方不需要做任何修改业务的实现可以通过适配器来完成不同的业务可以使用不同的适配器。良好扩展性。若要增加业务场景只需要增加适配器类来满足业务即可。
缺点
不利于维护。因为业务的实现基于适配器完成适配器中代码的复杂程度会越来越高不熟悉业务或者底层逻辑的人难以短时间内接手维护。系统结构易混乱。当业务量快速增加时适配器类的数量也会快速增加没有良好的系统架构布局最终会使得整个系统臃肿且危险。
3.两种适配器类型
类适配器模式适配器类通过继承适配者类多重继承达到适配目的部分语言可能不支持多重继承如C#。对象适配器模式适配器类中存放适配者类的实例对象调用它来达到适配目的该模式较常用。
4.示例代码
4.1 类适配器模式
#pragma once
#include iostreamusing 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.husing 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博客