• 适配器模式 结构性模式之五


    1.概念

            适配器模式是一种结构型的软件设计模式,也称包装模式,即将相对复杂的功能(可能用到多个类)封装起来,提供一个使用者想要的接口,使用者只需要调用接口,不需要知道接口里封装的内容是如何实现的。比如在面对一些第三方库或者SDK开发时,它们的接口往往与我们自己想要的接口不一致,此时适配器模式可以很好地扮演一个接口转换器的角色,将别人的接口与我们的接口对应上。

    2.优缺点

    优点:

    1. 良好封装性。接口内的内容对使用者而言是透明的,即看不见,这确保了内部功能具备较好的封装性,不易被改动。
    2. 解耦。不匹配的两方在适配器的作用下可以做到解耦,不需要修改任何一方原有代码逻辑。
    3. 良好复用性。适配的两方不需要做任何修改,业务的实现可以通过适配器来完成,不同的业务可以使用不同的适配器。
    4. 良好扩展性。若要增加业务场景,只需要增加适配器类,来满足业务即可。

    缺点:

    1. 不利于维护。因为业务的实现基于适配器完成,适配器中代码的复杂程度会越来越高,不熟悉业务或者底层逻辑的人难以短时间内接手维护。
    2. 系统结构易混乱。当业务量快速增加时,适配器类的数量也会快速增加,没有良好的系统架构布局,最终会使得整个系统臃肿且危险。      

    3.两种适配器类型

    1. 类适配器模式:适配器类通过继承适配者类(多重继承),达到适配目的,部分语言可能不支持多重继承(如C#)。
    2. 对象适配器模式:适配器类中存放适配者类的实例对象,调用它来达到适配目的,该模式较常用。

    4.示例代码

    4.1 类适配器模式

    1. #pragma once
    2. #include
    3. using namespace std;
    4. // 巴斯勒相机类(适配者)
    5. class BaslerCamera
    6. {
    7. public:
    8. // 打开相机
    9. void openBaslerCamera() {
    10. cout << "巴斯勒相机:打开相机。" << endl;
    11. }
    12. // 关闭相机
    13. void closeBaslerCamera() {
    14. cout << "巴斯勒相机:关闭相机。" << endl;
    15. }
    16. // 打开曝光设置
    17. void openExposureSettings() {
    18. cout << "巴斯勒相机:打开曝光设置。" << endl;
    19. }
    20. // 更改相机帧率
    21. void changeCameraFrame() {
    22. cout << "巴斯勒相机:更改相机帧率。" << endl;
    23. }
    24. };
    25. // 相机接口类
    26. class Camera
    27. {
    28. public:
    29. // 构造函数
    30. Camera() {};
    31. // 析构函数
    32. virtual ~Camera() {};
    33. // 打开相机
    34. virtual void openCamera() = 0;
    35. // 关闭相机
    36. virtual void closeCamera() = 0;
    37. // 配置属性
    38. virtual void setConfig() = 0;
    39. };
    40. // 相机适配器类
    41. class CameraAdapter :public Camera, public BaslerCamera
    42. {
    43. public:
    44. // 打开相机
    45. virtual void openCamera() {
    46. openBaslerCamera();
    47. }
    48. // 关闭相机
    49. virtual void closeCamera() {
    50. closeBaslerCamera();
    51. }
    52. // 配置属性
    53. virtual void setConfig() {
    54. // 打开曝光设置
    55. openExposureSettings();
    56. // 更改相机帧率
    57. changeCameraFrame();
    58. }
    59. };
    60. int main()
    61. {
    62. Camera* m_camera = new CameraAdapter();
    63. // 打开相机
    64. m_camera->openCamera();
    65. // 配置相机
    66. m_camera->setConfig();
    67. // 关闭相机
    68. m_camera->closeCamera();
    69. delete m_camera;
    70. return 0;
    71. }

    Camera类的接口使我们实际想要的接口,但是事实上我们拿到的现有的接口BaslerCamera类提供的接口,因此需要CameraAdapter作为类适配器,它同时继承自Camera和BaslerCamera两个类。

    4.2 对象类适配器模式

    1. #pragma once
    2. #include
    3. #include "BaslerCamera.h"
    4. using namespace std;
    5. // 相机接口类
    6. class Camera
    7. {
    8. public:
    9. // 构造函数
    10. Camera() {};
    11. // 析构函数
    12. virtual ~Camera() {};
    13. // 打开相机
    14. virtual void openCamera() = 0;
    15. // 关闭相机
    16. virtual void closeCamera() = 0;
    17. // 配置属性
    18. virtual void setConfig() = 0;
    19. };
    20. // 相机适配器类
    21. class CameraAdapter :public Camera
    22. {
    23. public:
    24. // 构造函数
    25. CameraAdapter() {
    26. m_baslerCamera = new BaslerCamera();
    27. }
    28. // 析构函数
    29. virtual ~CameraAdapter() {
    30. if (m_baslerCamera != nullptr) {
    31. delete m_baslerCamera;
    32. m_baslerCamera = nullptr;
    33. }
    34. }
    35. // 打开相机
    36. virtual void openCamera() {
    37. m_baslerCamera->openBaslerCamera();
    38. }
    39. // 关闭相机
    40. virtual void closeCamera() {
    41. m_baslerCamera->closeBaslerCamera();
    42. }
    43. // 配置属性
    44. virtual void setConfig() {
    45. // 打开曝光设置
    46. m_baslerCamera->openExposureSettings();
    47. // 更改相机帧率
    48. m_baslerCamera->changeCameraFrame();
    49. }
    50. private:
    51. BaslerCamera *m_baslerCamera; // 适配者类实例
    52. };
    53. int main()
    54. {
    55. Camera* m_camera = new CameraAdapter();
    56. // 打开相机
    57. m_camera->openCamera();
    58. // 配置相机
    59. m_camera->setConfig();
    60. // 关闭相机
    61. m_camera->closeCamera();
    62. delete m_camera;
    63. return 0;
    64. }

    适配器类做了改变,类中增加了一个适配者类的实例对象,调用的结果同类适配器模式一致。

    引用

     

    设计模式之适配器模式(C++)_c++适配器模式-CSDN博客

     

     

  • 相关阅读:
    csdn 格式规范
    3D孪生场景搭建:模型区域摆放
    基于MS16F3211芯片的触摸控制灯的状态变化和亮度控制(11.20)
    深度学习入门(四十五)计算机视觉——目标检测数据集
    创建型模式
    mysql 连接不上,start the server错误,服务启动停止,怎么都连不上。
    搭建自己的脚手架
    2022-09-12 mysql语法分析实现
    开源日报 0821:帮你修复老旧照片
    Linux 命令 poll 和 ppoll 详解 + 实例
  • 原文地址:https://blog.csdn.net/Physics_ITBoy/article/details/133383725