适配器模式(C++)

news2024/11/22 19:23:21

定义

将一个类的接口转换成客户希望的另一个接口。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.coloradmin.cn/o/842049.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Codeforces Round 890 (Div. 2) D. More Wrong(交互题 贪心/启发式 补写法)

题目 t(t<100)组样例&#xff0c;长为n(n<2000)的序列 交互题&#xff0c;每次你可以询问一个区间[l,r]的逆序对数&#xff0c;代价是 要在的代价内问出最大元素的位置&#xff0c;输出其位置 思路来源 neal Codeforces Round 890 (Div. 2) supported by Constructo…

python:isdigit()、isalpha()、isalnum() 三个函数的区别和注意点

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 一、isdigit() python关于 isdigit() 内置函数的官方定义&#xff1a; S.isdigit() -> bool Return True if all characters in S are digitsand there is at least one character in S, False otherwise.翻…

文心一言 VS 讯飞星火 VS chatgpt (72)-- 算法导论7.1 3题

三、请简要地证明:在规模为 n 的子数组上&#xff0c;PARTITION 的时间复杂度为 Θ(n)。 文心一言&#xff1a; 首先&#xff0c;我们需要明确PARTITION函数的具体定义。PARTITION函数通常用于快速排序算法中&#xff0c;它将一个数组分为两个子数组&#xff0c;使得一个子数…

【TypeScript】交叉类型联合类型(四)

【TypeScript】交叉类型&联合类型&#xff08;四&#xff09; 【TypeScript】交叉类型&联合类型&#xff08;四&#xff09;一、简介二、交叉类型2.1 交叉类型使用的注意点2.2 基本数据类型交叉2.3 对象类型交叉 三、联合类型四、类型缩减 一、简介 TypeScript 中的交…

【二】SPI IP核的使用

【一】SPI IP核使用&#xff1a;传送门 基于qsys通过spi外部总线协议对sd卡进行读写操作 一、实验平台与实验的目的&#xff1a; ​ 正点原子开拓者、芯片型号&#xff1a;EP4CE10F17C8&#xff1b;还需要一张sd卡。 ​ 该实验主要是利用SPI IP核驱动SD卡来实现读写实验&am…

主成分分析学习笔记

概述 主成分分析&#xff08;Principal Component Analysis&#xff09;是一种常见的数据分析方式&#xff0c;常用于高维数据的降维&#xff0c;提取数据的主要特征分量&#xff0c;其数学推导可以从最大可分性和最近重构性两个角度着手&#xff0c;前者的优化条件为划分后方…

MySQL-NoSQL整体笔记---持续输出中

MySQL部分 一、搭建 MySQL 数据库服务器 1、下载并上传glibc版本的Mysql 2、新建用户以安全方式运行进程 [roottemplate ~]# groupadd -r -g 306 mysql [roottemplate ~]# useradd -g 306 -r -u 306 mysql3、安装并初始化mysql [roottemplate ~]# tar xf mysql-5.7.36-linu…

【Azure Developer】使用 Microsoft Graph API 获取 AAD User 操作示例

问题解答 使用Microsoft Graph API&#xff0c;演示如何获取AAD User信息&#xff0c;因参考文档是针对Global Azure&#xff0c;所以文档种的URL为&#xff1a; // Global Azure Microsoft Graph API Host GET https://graph.microsoft.com/v1.0/me 需要修改为 // 中国区A…

iperf 安装与使用

iperf命令是一个网络性能测试工具&#xff0c;可以测试TCP和UDP带宽质量。同时也可以通过UDP测试报告网丢包率或者发包性能&#xff0c;是一个非常实用的工具 1.windwos安装 可以直接通过官网下载对应系统版本进行安装&#xff08;https://iperf.fr/iperf-download.php&#…

无涯教程-Perl - each函数

描述 在列表context中调用此函数时,将返回一个由2个元素组成的列表,该列表由哈希的下一个元素的键和值组成,以便您可以对其进行迭代。在标量context中调用时,仅返回哈希中下一个元素的键。 语法 以下是此函数的简单语法- each HASH返回值 在列表context中调用此函数时,将返…

红帽认证前景如何,有什么优势?

红帽Linux认证优势: RedHat是全球最大的开源技术厂家&#xff0c;是世界领先的开源解决方案供应商&#xff0c;其产品RedHat Enterprise Linux&#xff08;红帽企业级 Linux&#xff09;也是全世界应用最广泛的Linux。 作为检验Linux技能的黄金标准&#xff0c; RHCE认证项目已…

农商行基于分类分级的数据安全管控建设实践

《数据安全法》颁布实施以来&#xff0c;以分类分级为基础&#xff0c;对数据进行差异化管理和防护&#xff0c;成为行业共识。 金融行业作为数据密集的高地&#xff0c;安全是重中之重&#xff0c;而鉴于金融数据种类和内容庞杂&#xff0c;面临规模化用数、普惠用数、跨机构共…

Selenium自动化测试之学会元素定位

这是我经常被问到的一个问题&#xff0c;也是我很讨厌回答的问题&#xff0c;因为要想回答这个问题需要知道上下文。什么样式的元素&#xff0c;有哪些属性&#xff0c;是否有表单嵌套&#xff0c;都尝试了哪些定位方法。。。而且没几个提问者能事先详细的说明这些。哪儿像提bu…

[Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序

1.今天开发了一套服务程序&#xff0c;使用的是Odbc连接MySql数据库&#xff0c; 在我本机用VS打开程序时&#xff0c;访问一切正常&#xff0c;当发布出来装在电脑上&#xff0c;连接数据库时提示&#xff1a; [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定…

Python Opencv实践 - 基本图像IO操作

import numpy as np import cv2 as cv import matplotlib.pyplot as plt#读取图像 #cv2.IMREAD_COLOR&#xff1a; 读取彩色图像&#xff0c;忽略alpha通道&#xff0c;也可以直接写1 #cv2.IMREAD_GRAYSCALE: 读取灰度图&#xff0c;也可以直接写0 #cv2.IMREAD_UNCHANGED: 读取…

跨平台开发框架Qt:面向对象、丰富API

Qt是一个跨平台C图形用户界面应用程序开发框架&#xff0c;它具有以下三大优势&#xff1a; 优良的跨平台特性&#xff1a;Qt支持多种操作系统&#xff0c;包括Windows、Linux、Solaris、HP-UX、Irix、FreeBSD等&#xff0c;使开发人员能够在不同平台上开发和部署应用程序&…

如何在业务中体现TCC事务模型?

在分布式系统设计中&#xff0c;随着微服务的流行&#xff0c;通常一个业务操作被拆分为多个子任务&#xff0c;比如电商系统的下单和支付操作&#xff0c;就涉及到了创建和更新订单、扣减账户余额、扣减库存、发送物流消息等&#xff0c;那么在复杂业务开发中&#xff0c;如何…

【多重信号分类】超分辨率测向方法——依赖于将观测空间分解为噪声子空间和源/信号子空间的方法具有高分辨率(HR)并产生准确的估计(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

ApplicationContent 和BeanFactory的关系

选中这个类&#xff0c; ctrl alt u 从springboot的启动类说起 我们知道这个启动类返回值呢是哟个configurableApplicationContent 类型 我们查看她的类图 从图中我们可以看出&#xff0c;configurableApplicationContent是见解的继承了BeanFactory接口&#xff0c;扩展了他…

Centos7克隆快速复制多台虚拟机|互通互联

背景&#xff1a;有时候&#xff0c;我们在用虚拟机的时候会用到多个进行使用。重新安装会花费大量的时间&#xff0c;此时&#xff0c;我们可以通过vmware虚拟机自带的功能快速克隆出完全相同的系统。 前提&#xff1a;被克隆的虚拟机系统要处于关闭状态 步骤&#xff1a;…