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

技术成神之路:设计模式(十八)适配器模式

介绍

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许接口不兼容的类可以协同工作,通过将一个类的接口转换成客户端所期望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。

1.定义


适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容而无法一起工作的类可以一起工作。

2. 主要作用


  • 接口兼容:使得两个不兼容的接口能够工作在一起。
  • 解耦:通过适配器将客户端与被适配者解耦,减少了系统的耦合性。
  • 重用性:允许现有的类在不修改的情况下被复用,提高了代码的重用性。

3. 解决的问题


  • 当现有类的接口和需求的接口不兼容时,适配器模式可以将现有接口转换成所需接口。
  • 在不修改现有类的前提下,使其能够适应新的接口需求,充分复用现有代码。

4. 模式原理


包含角色:

  1. Target(目标接口): 客户端期望的接口。
  2. Adapter(适配器): 实现了目标接口,并且持有一个被适配对象的实例。
  3. Adaptee(被适配的类): 原本存在的接口或类。

UML类图:
在这里插入图片描述
代码示例:

// 目标接口
interface Printer {void print(String content);
}// 旧类(不兼容的接口)
class OldPrinter {void printText(String text) {System.out.println("OldPrinter: " + text);}
}// 适配器类
class PrinterAdapter implements Printer {private OldPrinter oldPrinter;public PrinterAdapter(OldPrinter oldPrinter) {this.oldPrinter = oldPrinter;}@Overridepublic void print(String content) {// 在适配器中处理图像打印的逻辑String textContent = convertImageToText(content);oldPrinter.printText(textContent);}// 假设这是一个将图像转换为文本的方法private String convertImageToText(String image) {return "Converted Image: " + image;}
}

调用

public class AdapterPatternDemo {public static void main(String[] args) {OldPrinter oldPrinter = new OldPrinter();Printer printerAdapter = new PrinterAdapter(oldPrinter);// 客户端使用适配器打印图像printerAdapter.print("SampleImage.jpg");}
}

打印输出

OldPrinter: Converted Image: SampleImage.jpg

适配器在我们的生活中无处不在,帮助不同系统、设备和协议之间实现兼容与互通比如电源适配器,耳机适配器,家用电器的转换插头,文件格式转换等等…

正如你想的那样,将一种不可使用的东西,通过一系列适配达到可用状态,这就是适配器模式的含义。

在Java中InputStreamReader可以被视为适配器,将字节流(InputStream)转换为字符流(Reader

InputStream inputStream = new FileInputStream("xxx.txt");
Reader reader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(reader);

Java的集合框架中,Collections类提供了多个适配器方法,例如ListIterator。它允许对List集合进行双向迭代。

 List<String> list = new ArrayList<>();ListIterator<String> iterator = list.listIterator();while (iterator.hasNext()) {System.out.println(iterator.next());}

在安卓中,适配器的含义是将数据转化成UI显示出来。例如RecyclerView.Adapter是一个典型的适配器模式示例。RecyclerView本身并不知道数据的来源,适配器充当了RecyclerView和数据之间的桥梁。

其实适配器真没啥介绍的,大家已经熟悉的不能再熟悉了,此篇文章就当用来帮助大家加固下对适配器模式的印象吧!😜

5. 优缺点


优点:

  1. 单一职责原则:将接口转换代码封装在适配器中,不需要修改原有类。
  2. 开闭原则:添加新的适配器,不需要修改已有代码。
  3. 提高复用性:可以复用现有类,减少代码重复。

缺点:

  1. 复杂性增加:引入适配器模式会增加系统的复杂性,增加了额外的类。
  2. 类适配器的局限性:类适配器使用多重继承,可能不适用于所有面向对象语言(如Java只支持单继承)。

6. 应用场景


  • 需要与不兼容的接口或类库进行集成。
  • 需要使用现有类的功能,但它们的接口不符合客户端的要求。
  • 在系统中需要将多个不同的接口统一为一个接口。

7. 对象适配器(Object Adapter)和类适配器(Class Adapter)区别


特性类适配器(Class Adapter)对象适配器(Object Adapter)
实现方式通过继承(类)通过组合(对象)
适配方式编译时适配运行时适配
灵活性不够灵活,适配关系固定灵活,适配对象可以在运行时更改
对变化的影响被适配类变化影响较大被适配类变化影响较小

8. 总结


适配器模式是一种结构型设计模式,通过将一个类的接口转换为客户端期望的接口,使得原本不兼容的类可以一起工作。它主要解决接口不兼容的问题,提高代码的复用性和灵活性。虽然引入了额外的复杂性,但它在需要复用现有代码,或者在不修改源代码的前提下适应新接口需求的场景下,非常有用。适配器模式有类适配器和对象适配器两种实现方式,各自有优缺点,选择时应根据具体需求和语言特性来决定。

相关文章:

技术成神之路:设计模式(十八)适配器模式

介绍 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许接口不兼容的类可以协同工作&#xff0c;通过将一个类的接口转换成客户端所期望的另一个接口&#xff0c;使得原本由于接口不兼容而不能一起工作的类可以一起工作。 1.定义 适配…...

图神经网络:处理复杂关系结构与图分类任务的强大工具

创作不易&#xff0c;您的打赏、关注、点赞、收藏和转发是我坚持下去的动力&#xff01; 图神经网络&#xff08;Graph Neural Network, GNN&#xff09;是针对图数据的一类神经网络模型。图数据具有节点&#xff08;节点代表实体&#xff09;和边&#xff08;边代表节点之间的…...

LeetCode: 1971. 寻找图中是否存在路径

寻找图中是否存在路径 原题 有一个具有 n 个顶点的 双向 图&#xff0c;其中每个顶点标记从 0 到 n - 1&#xff08;包含 0 和 n - 1&#xff09;。图中的边用一个二维整数数组 edges 表示&#xff0c;其中 edges[i] [ui, vi] 表示顶点 ui 和顶点 vi 之间的双向边。 每个顶点…...

mysql 查询表所有数据,分页的语句

在 MySQL 中&#xff0c;若要从表中查询所有数据并实现分页&#xff0c;你可以使用 SELECT 语句结合 LIMIT 和 OFFSET 子句。LIMIT 用于指定返回的记录数&#xff0c;而 OFFSET 则用于指定从哪一条记录开始返回&#xff08;即跳过的记录数&#xff09;。 以下是一个基本的分页…...

TI DSP TMS320F280025 Note13:CPUtimer定时器原理分析与使用

TMS320F280025 CPUtimer定时器原理分析与使用 ` 文章目录 TMS320F280025 CPUtimer定时器原理分析与使用框图分析定时器中断定时器使用CPUtimers.cCPUtimers.h框图分析 定时器框图如图所示 定时器有一个预分频模块和一个定时/计数模块, 其中预分频模块包括一个 16 位的定时器分…...

Australis 相機率定軟體說明

概要 課堂中使用Australis這套軟體&#xff0c;順帶記錄操作過程 內容以老師口述及我測試的經過 照片為老師課堂提供之 說明 執行 Step1. 匯入照片 注意&#xff01;&#xff01;如果是Mac的作業系統&#xff0c;將資料夾移到Windows上的時候&#xff0c;建議創一個新的資料…...

C++入门(有C语言基础)

string类 string类初始化的方式大概有以下几种&#xff1a; string str1;string str2 "hello str2";string str3("hello str3");string str4(5, B);string str5[3] {"Xiaomi", "BYD", "XPeng"};string str6 str5[2];str…...

第四届高性能计算与通信工程国际学术会议(HPCCE 2024)

目录 大会简介 主办单位&#xff0c;承办单位 征稿主题 会议议程 参会方式 大会官网&#xff1a;www.hpcce.net 大会简介 第四届高性能计算与通信工程国际学术会议&#xff08;HPCCE 2024&#xff09;将于2024年11月22-24日在苏州召开。HPCCE 2024将围绕“高性能计算与通信工…...

负载均衡架构解说

负载均衡架构是一种设计模式&#xff0c;用于在多个服务器之间分配网络或应用流量&#xff0c;以提高资源利用率、最大化吞吐量、减少响应时间&#xff0c;并确保高可用性。 负载均衡架构的关键组件和概念&#xff1a; 关键组件 1.负载均衡器&#xff08;Load Balancer&…...

【异常数据检测】孤立森林算法异常数据检测算法(数据可视化 Matlab语言)

摘要 本文研究了基于孤立森林算法的异常数据检测方法&#xff0c;并在MATLAB中实现了该算法的可视化。孤立森林是一种无监督的异常检测算法&#xff0c;主要通过构建决策树来区分正常数据和异常数据。本文使用真实数据集&#xff0c;通过二维可视化展示了检测结果。实验结果表…...

MKV转MP4丨FFmpeg的简单命令使用——视频格式转换

MKV是一种视频封装格式&#xff0c;很好用&#xff0c;也是OBS的默认推荐录制格式&#xff0c;因为不会突然断电关机而导致整个视频录制文件丢失。 但是MKV无法直接导入PR中剪辑&#xff0c;最直接的方法是将MKV转换为MP4格式&#xff0c;最方便且安全无损的转换方法便是用FFmp…...

git使用“保姆级”教程4——版本回退及分支讲解

一、版本回退 1、历史回退(版本回退)——命令行git reset --hard 版本编号 注意&#xff1a;当前命令会让工作区的内容发生改变&#xff0c;可以理解成历史区(master分支)直接回到工作区比如&#xff1a;从版本4回到版本3&#xff0c;则工作区只会显示版本3的代码内容 1.1、指…...

spring cache,Spring data redis

本项目使用Redis存储缓存数据&#xff0c;如何通过Java去访问Redis&#xff1f; 常用的有Jedis和Lettuce两个访问redis的客户端类库 &#xff0c;Jedis和Lettuce都是redis提供的。其中Lettuce的性能和并发性要好一些&#xff0c;Spring Boot 默认使用的是 Lettuce 作为 Redis …...

10.数据结构与算法-线性表的应用(线性表与有序表的合并)

线性表的合并 有序表的合并 顺序表 链表...

GAN|对抗| 生成器更新|判别器更新过程

如上图所示&#xff0c;生成对抗网络存在上述内容&#xff1a; 真实数据集&#xff1b;生成器&#xff1b;生成器损失函数&#xff1b;判别器&#xff1b;判别器损失函数&#xff1b;生成器、判别器更新&#xff08;生成器和判别器就是小偷和警察的关系&#xff0c;他们共用的…...

day01——登录功能

逻辑&#xff1a; 前端将登录信息通过报文的形式&#xff0c;发送给后端。后端进行登陆验证 2.1 根据接受的用户名&#xff0c;查询数据表。 若不存在该用户的记录&#xff0c;返回用户不存在。 若用户存在&#xff0c;判断数据库中的密码和接收的是否一致&#xff0c;不一致则…...

Flutter中使用FFI的方式链接C/C++的so库(harmonyos)

Flutter中使用FFI的方式链接C/C库&#xff08;harmonyos&#xff09; FFI plugin创建和so的配置FFI插件对so库的使用 FFI plugin创建和so的配置 首先我们可以根据下面的链接生成FFI plugin插件&#xff1a;开发FFI plugin插件 然后在主项目中pubspec.yaml 添加插件的依赖路径&…...

【C++】二义性

在C中&#xff0c;二义性&#xff08;ambiguity&#xff09;通常指的是编译器无法确定使用哪个函数、变量或类成员的情况。这种不确定性通常是由于继承和多态特性导致的。下面是一些常见的产生二义性的场景以及如何解决它们的方法&#xff1a; 1. 多重继承中的二义性 当一个类…...

高并发内存池(五):ThreadCache、CentralCache和PageCache的内存回收机制、阶段性代码展示和释放内存过程的调试

目录 ThreadCache的内存回收机制 补充内容1 补充内容2 补充内容3 补充内容4 ListTooLong函数的实现 CentralCache的内存回收机制 MapObjectToSpan函数的实现 ReleaseListToSpans函数的实现 PageCache的内存回收机制 补充内容1 补充内容2 ReleaseSpanToPageCache函…...

STL之stackqueue篇(上)探索C++ STL中的Queue与Stack——构建数据处理的基础框架

文章目录 前言一、stack1.1 定义与基本概念1.2 底层容器1.3 成员函数1.4 使用示例1.5 注意事项1.6 应用场景 二、queue2.1 定义与基本概念2.2 底层容器2.3 成员函数2.4 使用示例2.5 注意事项2.6 应用场景 前言 本文旨在深入探讨C STL中的queue与stack容器&#xff0c;从它们的…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

实战设计模式之模板方法模式

概述 模板方法模式定义了一个操作中的算法骨架&#xff0c;并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下&#xff0c;重新定义算法中的某些步骤。简单来说&#xff0c;就是在一个方法中定义了要执行的步骤顺序或算法框架&#xff0c;但允许子类…...

ThreadLocal 源码

ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物&#xff0c;因为每个访问一个线程局部变量的线程&#xff08;通过其 get 或 set 方法&#xff09;都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段&#xff0c;这些类希望将…...

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...

k8s从入门到放弃之Pod的容器探针检测

k8s从入门到放弃之Pod的容器探针检测 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;容器探测是指kubelet对容器执行定期诊断的过程&#xff0c;以确保容器中的应用程序处于预期的状态。这些探测是保障应用健康和高可用性的重要机制。Kubernetes提供了两种种类型…...