适配器模式【结构型模式C++】

1.概述

    适配器模式是一种结构型设计模式, 又称为变压器模式、包装模式(Wrapper) 将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

2.结构

  • Target:适配器的内容,例如客户端使用的目标接口;
  • Adaptee:被适配的内容,例如不兼容的接口;
  • Adapter:适配器,把 Adaptee 适配成 Target

3.实现 

3.1 实例类比

       在生活中存在各类适配器,交流电220V会转化为各类所需电压, 以手机适配器为例。在给手机充电 手机充电器相当于 Adapter适配器 ,220V的交流电 相当于 Adaptee 被适配者5V的直流电 相当于 Target目标 

3.2 具体实现
#include <iostream>
#include <string>
using namespace std;//被适配类即待转化的类
class Adaptee {
public:int OutPut220V() {std::cout << "正常220V电压..." << endl;return 220;}
};//转化目标
class Target {
public:virtual int OutPut5V()=0;
};//适配器
class Adapter :public Target {
public:int OutPut5V() {//输入的待转化电压int a = inPut_->OutPut220V();//转化方法int b = a / 44;//返回转化结果std::cout << "220V电压转化为5V电压..." << endl;return b;}void SetInpt(Adaptee * inPut) {inPut_ = inPut;}private:Adaptee * inPut_;
};int main()
{Adaptee * input_ = new Adaptee();Adapter * adater_ = new Adapter();adater_->SetInpt(input_);adater_->OutPut5V();return 0;
}
3.3运行结果

4.状态设计模式优缺点   

   优点: 
  • 将目标类和适配者类解耦
  • 增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性
  • 灵活性和扩展性都非常好,符合开闭原则。如果不想用就可以卸载适配器
   缺点:
  • 过多地使用适配器,会让系统非常零乱,不易整体进行把握。
  • 由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

5 应用场景

  • 两个类所做的事情相同或相似,但是具有不同的接口时要使用
  • 在双方都不太容易修改的时候再使用适配器模式适配,而不是一有不同时就使用它。
  • 系统需要使用一些现有的类,而这些类的接口与系统要求的接口不兼容。
  • 需要创建一个可复用的类,该类与一些不兼容的类合作工作,而不是修改这些类的代码。
  • 在已有的系统中,希望增加一些额外的功能,而这些功能需要与已有的类协同工作,但是不能对这些类进行修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/826529.shtml

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

相关文章

Leetcode算法训练日记 | day31

专题九 贪心算法 一、分发饼干 1.题目 Leetcode&#xff1a;第 455 题 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的…

MongoDB的使用场景

MongoDB的使用场景 MongoDB 是一个流行的文档型 NoSQL 数据库&#xff0c;适用于处理结构灵活、快速变化的数据以及需要高性能、高可用性和水平扩展能力的应用场景。以下是 MongoDB 的主要使用场景&#xff1a; Web & Mobile Applications: 实时数据处理&#xff1a;Mongo…

【算法一则】矩阵置零 【矩阵】【空间复用】

题目 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&#xff1a; …

冰达ROS机器人快速使用指南

欢迎来到《冰达ROS机器人极简使用指南》 Q&#xff1a;这份教程适合谁&#xff1f; A&#xff1a;适合完全0基础新手&#xff0c;需要快速跑起来机器人的基本功能。也适合技术大佬需要快速的了解冰达ROS机器人的使用方法。 Q&#xff1a;这份教程内容很少&#xff0c;是不是…

c# 反射的应用

简述&#xff1a; 反射指程序可以访问、检测和修改它本身状态或行为的一种能力。 程序集包含模块&#xff0c;而模块包含类型&#xff0c;类型又包含成员。反射则提供了封装程序集、模块和类型的对象。 您可以使用使用反射获取类型&#xff0c;根据类型来动态创建对象&#…

机器学习基本流程

Jupyter Notebook 代码连接&#xff1a; machine_learning_demo machine_learning_ensembles Step 1: Imports and Configuration import pandas as pd import numpy as np import copy import json import pickle import joblib import lightgbm as lgb import optuna impor…

【24届数字IC秋招总结】正式批面试经验汇总8——豪威、大普微

文章目录 一、豪威-数字电路设计工程师1.1 面试问题二、大普微-数字验证工程师2.1 一面面试问题2.2 二面面试问题2.3 hr面试问题一、豪威-数字电路设计工程师 面试时间:9.6 1.1 面试问题 1、 logic能不能随机产生x和z,如何产生 2、 断言怎么写的,a为高b为高 3、 讲下项目…

数据结构——7.17.2 查找的基本概念、顺序查找和折半查找

7.1&7.2 查找的基本概念、顺序查找和折半查找 1. 基本概念 1. 关键字&#xff1a;数据元素中标识该元素的某个数据项的值&#xff0c;使用基于关键字的查找&#xff0c;查找结果应该是唯一的。2. 查找表的常见操作1. 查找符合条件的数据元素&#xff1a;查得快即可2. …

国产数据库实践:亚信安慧AntDB在DTC 2024展示创新实力

4月12至13日&#xff0c;我国数据库行业最具影响力的活动之一——第十三届『数据技术嘉年华』(DTC 2024) 在京成功举办&#xff0c;业内众多专家学者、技术领袖、各行业客户和实力厂商均到场参会。亚信安慧AntDB数据库总架构师洪建辉受邀参与“数据库一体化”专题论坛&#xff…

Stylus精讲:网页设计新境界【写作AI一键生成】

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

《HCIP-openEuler实验指导手册》1.1Apache安装与测试

一、安装httpd 查看软件仓库中apache版本列表 dnf provides http 安装apache dnf install -y httpd 二、启动http并测试 查看apache版本号 httpd -v 检查配置文件是否正确 httpd -t 启动并设置为开机启动 systemctl enable httpd --now 或 systemctl enable httpd syst…

Android--ConnectivityManager使用

一、前言 Android10之后官方废弃了通过WifiManager连接WIFI的方式&#xff0c;现在要使用ConnectivityManager连接WIFI 二、连接WIFI public class MainActivity extends AppCompatActivity {private static final String TAG"lkx";Overrideprotected void onCrea…

yolov8实战第七天——pyqt5-yolov8实现车牌识别系统(参考论文(约7000字)+环境配置+完整部署代码+代码使用说明+训练好的模型)

基于 pyqt5-yolov8实现车牌识别系统,包括图片车牌识别,视频车牌识别,视频流车牌识别。 效果展示(图片检测,检测到的内容添加到历史记录): 效果展示(视频检测,视频车辆只会添加一条记录,下文更多实际应用中的优化策略): 基于YOLOv8和PyQt5的车牌识别系统设计与…

day60 接雨水 柱状图中的最大矩形

题目1&#xff1a;42 接雨水 题目链接&#xff1a;42 接雨水 题意 n个宽度为1高度不一致的柱子排列&#xff0c;可以接多少雨水 找寻当前柱子的左面第一个比该柱子高的(栈顶的下一个元素)&#xff0c;右面第一个比该柱子高的(当前遍历的元素)&#xff0c;作差 得到宽度&…

CUDA_cudaFree_释放Stream_cudaError_t 错误类型码解释

官方网站 &#xff1a; CUDA Runtime API :: CUDA Toolkit Documentation cudaFree() 说明 cudaFree() 是 CUDA 中用于释放由 cudaMalloc() 或 cudaMallocManaged() 分配的设备内存的函数。它的参数是一个指向设备内存的指针&#xff0c;用于指示要释放的内存块的起始地址。…

在React项目中试用Tailwind

TailwindCSS TailwindCSS 是一个套 CSS 的工具类&#xff0c;把常用的功能都进行了定义&#xff0c;下面是一个官网的例子&#xff0c;可以看到Tailwind对一元页面素写了很多类&#xff0c;日常开发中只要定义一两个类就可以搞定类似的功能了。这里写了这么多 p-6 max-w-sm mx…

java导出数据到excel表中

java导出数据到excel表中 环境说明项目结构1.controller层2.service层3.实现层4.工具类&#xff1a;ExcelUtil.java5.ProductModel.java类 使用的Maven依赖postman请求展示&#xff0c;返回内容需要前端接收浏览器接收说明&#xff08;如果下载下来的为zip类型&#xff0c;记得…

win docker clickhouse 挂载本地目录到容器后无法写入数据问题解决

win docker 部署clickhouse 挂载本地目录到容器后无法写入数据问题具体错误提示代码尝试在docker compose 文件中添加文件操作的许可进一步在docker compose 中配置 ulimits参数如下修改映射的本地目录到d盘最后使用docker的数据卷来映射到容器内部目录&#xff0c;解决了不能…

MySQL查询优化(学习)

1.在MySQL中&#xff0c;如何定位慢查询? MySQL自带慢日志 2.一个SQL语句执行很慢, 如何分析&#xff1f; 可以采用EXPLAIN 或者 DESC命令获取 MySQL 如何执行 SELECT 语句的信息 3.字段分析 idselect_typetablepartitionstype这条sql的连接的类型&#xff0c;性能有好到…

【报错】ModuleNotFoundError: No module named ‘mmcv‘

【报错】&#x1f494;&#x1f494;&#x1f494; ModuleNotFoundError: No module named mmcv 【解决方法】&#x1f49c;&#x1f49c;&#x1f49c; pip3 install mmcv -i https://pypi.tuna.tsinghua.edu.cn/simple 【测试】&#x1f49a;&#x1f49a;&#x1f49a; p…