适 配 器 模 式

前阵子,笔者在网上淘来一个二手显示屏来搭配我装好的主机,但是送到手上后我却找不到电源适配器的踪迹。于是我就在家找了根电源线接上了显示屏,倒是能亮,就是屏幕闪得和机关枪似的。这是因为我的显示屏需要12V的供电,我找的这根是5V的……

电源适配器的作用就是把220V的交流电转换成显示器的电压,起到一个转换的作用,我们的适配器模式(Adapter)也是这个意思。


介绍

适配器模式是一种结构型模式,旨在解决不同接口间的不兼容问题。

在一些情况下,我们可能需要一些老的代码接口放在新的环境,这时就可以考虑使用适配器模式了。

适配器模式有以下三个角色:

1、目标接口,即适配器类的统一接口,规范了每一个适配器的行为。也能够允许用户灵活切换适配器。

2、适配者类,其实更像是“被适配者“,就是被适配器转换的主人公,相当于电源适配器转换的220V电源。

3、适配器类,实际发生转换的地方,是目标接口的具体实现,即电源适配器本身。

根据适配者与适配器的关系,适配器又可以被分为类适配器(继承)和对象适配器(组合或委托)。而且,适配器模式一般在开发的初阶段很难用得到,而是会用在已有的代码中解决存在的问题。

类适配器

这里假设我们要调用一个人物移动的方法,他规定了我们上下左右的移动方法。但是我们只需要左右移动就好了,这时就可以使用适配器模式,达到简化参数的作用了,这也是适配器模式使用的一个关键场景。

#include<iostream>
using namespace std;
/*目标接口*/
class Target {
public:
virtual void request(int left, int right) = 0; //目标接口方法
virtual ~Target() = default;
};
/*适配者*/
class Adaptee {
public:
void move(int W, int A, int S, int D) {cout << "按下W后,在y轴给予一个大小为" << W << "的速度" << endl;cout << "按下A后,在x轴给予一个大小为" << -A << "的速度" << endl;cout << "按下S后,在y轴给予一个大小为" << -S << "的速度" << endl;cout << "按下D后,在x轴给予一个大小为" << D << "的速度" << endl;}
};
/*适配器*/
//类适配器模式,使用继承的方式链接适配器与适配者
class Adapter : public Target, public Adaptee {
public:
//只需要用到左与右的速度,所以将上与下的速度设置为0
void request(int left, int right) override {
//调用适配者的方法
move(0, left, 0, right);}
};

可以看到,这里的适配器和适配者是通过继承的关系连接的。但是继承的方法没有灵活性,有着只能单一继承的关系,所以更推荐下面组合的方式连接。

对象适配器

这里再假设我们需要做一个音频适配器,原本的音频是MP3格式的,而我们新环境需要一个OGG格式的音频,这时的适配器起到了转换数据的作用,也是适配器的一个关键场景。

#include<iostream>
using namespace std;
/*目标接口*/
class Target {
public:
virtual void request() = 0; //目标接口方法
virtual ~Target() = default;
};
/*适配者*/
class Adaptee {
public:
void playMusic() {cout << "我播放了一段mp3音频" << endl;}
};
/*适配器*/
//类适配器模式,使用继承的方式链接适配器与适配者
class Adapter : public Target {
public:Adaptee* adaptee;
//只需要用到左与右的速度,所以将上与下的速度设置为0
void request() override {
//调用适配者的方法adaptee->playMusic();}
private:
void convert() {cout << "您输出的音频已经成功转换!" << endl;cout << "我播放了一段ogg音频" << endl;}
};

这样一来,适配器与适配者通过组合的方式连接,更灵活。实际开发中也是类似的框架。


小结

这就是适配器模式的使用方法了,常常用来连结新旧代码或是实现数据转换,总体来说非常简单,不难理解。

如有补充交流欢迎留言,我们下次再见~

参考列表:

菜鸟教程-设计模式:www.runoob.com 

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

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

相关文章

智慧零售商品识别准确率↑32%:陌讯多模态融合算法实战解析

原创声明本文为原创技术解析&#xff0c;核心技术参数与架构设计引用自《陌讯技术白皮书》&#xff0c;禁止任何形式的未经授权转载。一、行业痛点&#xff1a;智慧零售的 "看得见的障碍"在智慧零售场景中&#xff0c;从自助结算终端到智能货架管理&#xff0c;计算机…

Linux系统编程-gcc(黑马笔记)

1 gcc的编译流程gcc编译的整个过程并且整个过程下来的每个过程。并且给出了每个阶段产物和gcc命令。1.1 数据段合并其实就是因为“块” 一次是读多个字节而不是一个字节&#xff0c;所以会将一些地址段合并从而提升效率1.2 地址回填这张图也有些问题&#xff0c;正确的结论是:地…

Git踩坑

文章目录前言❓问题分析&#xff1a;为什么你的提交会“覆盖”别人的代码&#xff1f;✅ 正确的代码提交流程&#xff08;结合你原文的说明&#xff09;**1. 确认自己在正确的分支上****2. 从主开发分支&#xff08;如 dev&#xff09;拉取最新代码并合并****3. 解决冲突&#…

sqli-labs:Less-20关卡详细解析

1. 思路&#x1f680; 本关的SQL语句为&#xff1a; $sql"SELECT * FROM users WHERE username$cookee LIMIT 0,1";注入类型&#xff1a;字符串型&#xff08;单引号包裹&#xff09;、GET操作提示&#xff1a;参数需以闭合关键参数&#xff1a;cookee php输出语句…

基于LevitUnet的超声图像分割

完整项目包获取&#xff1a;点击文末名片本项目旨在开发一个基于深度学习的图像分割模型&#xff0c;专门用于处理医学或遥感领域的图像数据&#xff08;以 TIFF 格式存储&#xff09;。通过结合 LeViT&#xff08;基于 Vision Transformer 的轻量模型&#xff09;和 U-Net 架构…

Java 17 新特性解析与代码示例

Java 17 新特性解析与代码示例 文章目录Java 17 新特性解析与代码示例引言1. 密封类&#xff08;JEP 409&#xff09;1.1. 介绍1.2. 详细说明1.3. 代码示例1.4. 与之前功能的对比1.5. 使用场景1.6. 总结2. switch 模式匹配&#xff08;预览&#xff0c;JEP 406&#xff09;2.1.…

SQL中的GROUP BY用法

GROUP BY 是 SQL 中用来“按列分组”的子句。 它把相同值的行分到同一个组&#xff0c;然后通常配合聚合函数&#xff08;COUNT, SUM, AVG, MAX, MIN 等&#xff09;对每个组做统计&#xff0c;最终每组只返回一行结果。✅ 1. 基本语法 SELECT 列1, 列2, 聚合函数(列3) FROM 表…

AI Agent开发学习系列 - LangGraph(10): 带有循环的Looping Graph(练习解答)

在AI Agent开发学习系列 - LangGraph(9): 带有循环的Looping Graph中&#xff0c;我们学习了如何创建带有循环的Looping Graph。为了巩固学习&#xff0c;我们来做一个练习。 用LangGraph创建如下图的一个Agent: 要求&#xff1a; 输入玩家姓名通过输入的上限值和下限值之间…

【保姆级 - 大模型应用开发】DeepSeek R1 本地部署全攻略:Ollama + vLLM + PyTorch 多选方案

DeepSeek R1 本地部署全攻略&#xff1a;Ollama vLLM PyTorch 多选方案 想部署 DeepSeek-R1 模型到本地&#xff0c;开启高性能推理体验&#xff1f;本文汇总了 Ollama、vLLM 及原生 PyTorch 的部署方法&#xff0c;适合不同开发者需求。 &#x1f3af; 下载模型 (必做) ----…

使用 Vive Tracker 替代 T265 实现位姿获取(基于 Ubuntu + SteamVR)

在Dexcap这篇工作列出第二版硬件清单时&#xff0c;我注意到其使用 Vive Tracker 替代 Intel T265 来获取位姿数据&#xff0c;对这个东西的性能感到好奇&#xff0c;最近因为需要跟进相关工作&#xff0c;参与了一部分实现&#xff0c;由于这方面的中文资料相对较少&#xff0…

博物馆 VR 导览:图形渲染算法+智能讲解技术算法实现及优化

本文面向博物馆数字化开发技术员、VR 系统工程师等技术同仁们&#xff0c;聚焦图形渲染算法在博物馆 VR 导览中的核心应用&#xff0c;解决虚拟展馆还原精度不足、多终端适配卡顿、智能讲解触发延迟等实际技术问题。如有项目合作及技术交流欢迎私信作者~一、VR导览技术痛点1.3D…

zset 中特殊的操作

首先 zset 与我们常规的 redis 操作有所不同, 这里的时间复杂度基本都是 O(log N) 起步的 目录 1. zcount 2. zpopmax 1. zcount zcount key min max : 这里求的是 key 中下标在 min 和 max 之间的 元素的数量, 这里是比区间 我们要是想排除端点, 就需要加上 ( , 无论是…

KSP与ASM深度对比:原理、性能与使用场景

一、核心目的差异1. KSP&#xff08;Kotlin Symbol Processing&#xff09;核心目的&#xff1a;在编译时生成新代码&#xff0c;解决样板代码问题(操作对象:.kt源文件编译过程中的中间表示)主要场景&#xff1a;自动生成DI&#xff08;依赖注入&#xff09;配置代码创建路由映…

【LLM】如何在Cursor中调用Dify工作流

这篇文章将通过一个接口文档知识库示例&#xff0c;带你了解如何在 Cursor 中通过 Mcp Server 调用 Dify 平台配置的工作流。 1. 准备工作 需要准备文本生成模型、向量模型、Rerank 模型&#xff08;可选&#xff09;&#xff0c;这些都可以在 阿里云百炼平台 申请免费使用额度…

L1、L2正则化的几何解释

L2正则化: 图中用几何方式形象地解释了 Ridge 回归&#xff08;L2正则化&#xff09;的原理。 ① 阴影圆&#xff1a;可以理解为&#xff08;w1^2 w2^2&#xff09;​≤R^2&#xff0c;圆周表示目标函数的约束线&#xff0c;这个圆表示了我们的参数 (w1,w2)可以活动的范围。 …

【学习笔记】Java并发编程的艺术——第1章 并发编程的挑战

第1章 并发编程的挑战 1.1 上下文切换 即使是单核处理器也支持多线程执行代码&#xff0c;CPU给每个线程分配CPU时间片实现多线程&#xff0c;而每个时间片一般是几十毫秒&#xff0c;所以多个线程感觉是同时执行的 但同一个核切换线程执行时会保存运行状态&#xff0c;以便下次…

leecode3 无重复元素的最长子串

我的思路 原始代码 我发现我虽然解决问题了&#xff0c;但是我的思路不简洁&#xff0c;不明白。 这个题本质上还是滑动窗口的问题。 具体思路为先定义两个指针&#xff0c;对应滑动窗口的两个边界关键是&#xff1a;定义一个集合&#xff0c;来判断这个窗口中的元素是否存在重…

【嵌入式汇编基础】-ARM架构基础(三)

ARM架构基础(三) 文章目录 ARM架构基础(三) 7、AArch64 执行状态 7.3 程序计数器 7.4 堆栈指针 7.5 零寄存器 7.6 链接寄存器 7.7 帧指针 7.8 平台寄存器 (x18) 7.9 过程内调用寄存器 7.10 SIMD 和浮点寄存器 7.11 系统寄存器 7.13 PSTATE 7、AArch64 执行状态 7.3 程序计…

[buuctf-misc]喵喵喵

m题目在线评测BUUCTF 是一个 CTF 竞赛和训练平台&#xff0c;为各位 CTF 选手提供真实赛题在线复现等服务。https://buuoj.cn/challenges#%E5%96%B5%E5%96%B5%E5%96%B5BUUCTF 是一个 CTF 竞赛和训练平台&#xff0c;为各位 CTF 选手提供真实赛题在线复现等服务。https://buuoj.…

Vue 详情模块 2

Vue 渐进式JavaScript 框架 基于Vue2的移动端项目&#xff1a;详情基础内容&#xff0c;日期及电影描述 目录 详情 详情基础内容 初始化与赋值 渲染基础内容 详情样式 日期处理 安装moment 定义过滤器 使用过滤器 电影描述 总结 详情 详情基础内容 初始化与赋值 …