当前位置: 首页 > news >正文

适配器模式(C++)

定义

将一个类的接口转换成客户希望的另一个接口。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模式中的‘现存对象”作为新的接口方法参数,来达到适配的目的。
http://www.lryc.cn/news/114424.html

相关文章:

  • HTTP连接之出现400 Bad Request分析
  • 后端开发, 接口幂等性是什么意思
  • k8s手动发布镜像的方法
  • 十二、ESP32控制步进电机
  • 利用openTCS实现车辆调度系统(六)openTCS订单的使用
  • 第一天 什么是CSRF ?
  • 知识图谱推荐系统研究综述
  • 基于Centos7的Nginx源码安装
  • Ubuntu 20.04 安装 Stable Diffusionn
  • vue name命名错误 Do not use built-in or reserved HTML elements as component
  • 知识付费系统开发:构建高效智能的付费内容平台
  • 数据结构----结构--线性结构--递归
  • 在Windows批处理程序中实现延时功能
  • Java基础入门篇——Java变量类型的转换和运算符(七)
  • 20230807通过ffmpeg将DTS编码的AUDIO音频转换为AAC编码
  • 一生一芯1——windows与Ubuntu双系统安装
  • Linux下的CGI服务器
  • 后端开发3.Fastdfs的搭建
  • 目标检测与跟踪 (3)- TensorRTYOLO V8性能优化与部署测试
  • SAS-数据集SQL垂直(纵向)合并
  • SpringBoot3 整合Prometheus + Grafana
  • Python实现GA遗传算法优化LightGBM回归模型(LGBMRegressor算法)项目实战
  • 【基于IDEA + Spark 3.4.1 + sbt 1.9.3 + Spark MLlib 构建逻辑回归鸢尾花分类预测模型】
  • 资深测试老鸟整理,性能测试-常见调优详细,卷起来...
  • 【第五章 flutter学习之flutter进阶组件-上篇】
  • 鸿蒙边缘计算网关正式开售
  • Bytebase 2.5.0 - VCS 集成支持 Azure DevOps,支持达梦数据库
  • tomcat通过systemctl启动时报错Cannot find /usr/local/tomcat/bin/setclasspath.sh
  • Django架构图
  • vue- 创建wms-web项目