(七)趣学设计模式 之 适配器模式!

在这里插入图片描述

目录

    • 一、 啥是适配器模式?
    • 二、 为什么要用适配器模式?
    • 三、 适配器模式的实现方式
      • 1. 类适配器模式(继承插座 👨‍👩‍👧‍👦)
      • 2. 对象适配器模式(插座转换器 🔌)
      • 3. 接口适配器模式(万能插座 🗜️)
    • 四、 三种适配器的对比
    • 五、 适配器模式的优缺点
    • 六、 适配器模式的应用场景
    • 七、 总结

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解代理模式请看: (六)趣学设计模式 之 代理模式!

这篇文章带你详细认识一下设计模式中的适配器模式

一、 啥是适配器模式?

想象一下,你买了一个新的电器 💡,但是插头和家里的插座不匹配 😫,怎么办? 这时候就需要一个插座转换器 🔌,把电器的插头转换成家里的插座可以使用的类型 💡。

适配器模式,就是用来解决接口不兼容的问题! 它可以将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 🤝。

简单来说,就是把不兼容的接口转换成兼容的接口!

  • 你想使用一个类,但是它的接口和你需要的接口不一样: 就像你想用一个旧的类库,但是它的接口和你的代码不兼容 😫!
  • 你想让两个接口不兼容的类一起工作: 就像你想让一个美国的插头和一个中国的插座一起工作 🔌!
  • 你想重用一些现有的类,但是它们的接口不符合你的要求: 就像你想用一个旧的算法,但是它的输入输出格式和你的代码不兼容 😫!

二、 为什么要用适配器模式?

用适配器模式,好处多多 👍:

  • 提高类的复用性: 可以将一些现有的类适配成新的接口,方便重用 ♻️!
  • 提高系统的灵活性: 可以动态地选择不同的适配器,使得系统更加灵活 🤸!
  • 符合开闭原则: 可以在不修改现有代码的情况下,增加新的适配器,扩展功能 🆕!
  • 解耦: 将客户端和目标类解耦,降低系统的耦合度 🔗!

三、 适配器模式的实现方式

适配器模式主要分为三种:

  • 类适配器模式: 通过继承来实现适配,就像继承了插座的类 👨‍👩‍👧‍👦!
  • 对象适配器模式: 通过组合来实现适配,就像用一个插座转换器 🔌!
  • 接口适配器模式: 通过实现一个抽象类来实现适配,就像万能插座 🗜️!

1. 类适配器模式(继承插座 👨‍👩‍👧‍👦)

类适配器模式,通过继承来实现适配,就像继承了插座的类,拥有了插座的功能 🔌!

案例:电压适配器(经典案例 ⚡)

假设你有一个 220V 的电源 🔌,但是你需要给一个 5V 的设备充电 📱,怎么办? 这时候就需要一个电压适配器,把 220V 的电压转换成 5V 的电压 ⚡!

代码示例:

// 目标接口:5V 电压
public interface Voltage5V {int output5V(); // 输出 5V 电压
}// 需要适配的类:220V 电压
public class Voltage220V {public int output220V() {int src = 220;System.out.println("我是220V电压");return src;}
}// 适配器类:电压适配器
public class VoltageAdapter extends Voltage220V implements Voltage5V {@Overridepublic int output5V() {// 获取 220V 电压int srcV = output220V();// 转换成 5V 电压int dstV = srcV / 44;return dstV;}
}// 客户端
public class Client {public static void main(String[] args) {VoltageAdapter adapter = new VoltageAdapter(); // 创建适配器对象int voltage = adapter.output5V(); // 获取 5V 电压System.out.println("输出电压为:" + voltage + "V"); // 输出电压}
}

分析:

  • Voltage5V 是目标接口,客户端需要使用 5V 电压。
  • Voltage220V 是需要适配的类,它只能输出 220V 电压。
  • VoltageAdapter 是适配器类,它继承了 Voltage220V 类,并实现了 Voltage5V 接口,将 220V 电压转换成 5V 电压。

输出结果:

我是220V电压
输出电压为:5V

2. 对象适配器模式(插座转换器 🔌)

对象适配器模式,通过组合来实现适配,就像用一个插座转换器,把电器的插头转换成家里的插座可以使用的类型 🔌!

案例:还是电压适配器(对象版⚡)

还是上面的电压适配器的例子,但是这次我们使用对象适配器模式来实现 🚀!

代码示例:

// 目标接口:5V 电压
public interface Voltage5V {int output5V(); // 输出 5V 电压
}// 需要适配的类:220V 电压
public class Voltage220V {public int output220V() {int src = 220;System.out.println("我是220V电压");return src;}
}// 适配器类:电压适配器
public class VoltageAdapter implements Voltage5V {private Voltage220V voltage220V; // 组合 220V 电压对象public VoltageAdapter(Voltage220V voltage220V) {this.voltage220V = voltage220V;}@Overridepublic int output5V() {// 获取 220V 电压int srcV = voltage220V.output220V();// 转换成 5V 电压int dstV = srcV / 44;return dstV;}
}// 客户端
public class Client {public static void main(String[] args) {Voltage220V voltage220V = new Voltage220V(); // 创建 220V 电压对象VoltageAdapter adapter = new VoltageAdapter(voltage220V); // 创建适配器对象int voltage = adapter.output5V(); // 获取 5V 电压System.out.println("输出电压为:" + voltage + "V"); // 输出电压}
}

分析:

  • Voltage5V 是目标接口,客户端需要使用 5V 电压。
  • Voltage220V 是需要适配的类,它只能输出 220V 电压。
  • VoltageAdapter 是适配器类,它组合了 Voltage220V 类,并实现了 Voltage5V 接口,将 220V 电压转换成 5V 电压。

输出结果:

我是220V电压
输出电压为:5V

3. 接口适配器模式(万能插座 🗜️)

接口适配器模式,通过实现一个抽象类来实现适配,就像万能插座,可以兼容各种类型的插头 🗜️!

案例:USB 接口适配器(万能接口 💻)

假设你有一个 USB 设备 💾,但是你的电脑只有 Type-C 接口 💻,怎么办? 这时候就需要一个 USB 接口适配器,把 USB 接口转换成 Type-C 接口 💻!

代码示例:

// 目标接口:USB 接口
public interface Usb {void read(); // 读取数据void write(); // 写入数据void connect(); // 连接设备void disconnect(); // 断开连接
}// 抽象适配器类:USB 适配器
public abstract class UsbAdapter implements Usb {@Overridepublic void read() {// 默认实现,可以不实现}@Overridepublic void write() {// 默认实现,可以不实现}@Overridepublic void connect() {// 默认实现,可以不实现}@Overridepublic void disconnect() {// 默认实现,可以不实现}
}// 需要适配的类:Type-C 设备
public class TypeCDevice extends UsbAdapter {@Overridepublic void read() {System.out.println("Type-C 设备读取数据");}@Overridepublic void write() {System.out.println("Type-C 设备写入数据");}
}// 客户端
public class Client {public static void main(String[] args) {TypeCDevice typeCDevice = new TypeCDevice(); // 创建 Type-C 设备对象typeCDevice.connect(); // 连接设备typeCDevice.read(); // 读取数据typeCDevice.write(); // 写入数据typeCDevice.disconnect(); // 断开连接}
}

分析:

  • Usb 是目标接口,客户端需要使用 USB 接口。
  • UsbAdapter 是抽象适配器类,它实现了 Usb 接口,但是提供了默认实现,子类可以选择性地实现需要的方法。
  • TypeCDevice 是需要适配的类,它继承了 UsbAdapter 类,并实现了 readwrite 方法,实现了 USB 接口的功能。

输出结果:

Type-C 设备读取数据
Type-C 设备写入数据

四、 三种适配器的对比

特性类适配器模式对象适配器模式接口适配器模式
实现方式继承组合抽象类
优点简单易用灵活,可以适配多个类可以选择性地实现接口方法
缺点只能适配一个类,耦合度较高需要持有目标类的对象,增加了对象的数量需要定义抽象类,增加了类的数量
适用场景目标类接口比较稳定,不需要经常修改需要适配多个类,或者目标类接口经常修改只需要使用接口中的部分方法

五、 适配器模式的优缺点

优点:

  • 提高类的复用性 ♻️!
  • 提高系统的灵活性 🤸!
  • 符合开闭原则 🆕!
  • 解耦 🔗!

缺点:

  • 增加了系统的复杂度 😫!
  • 可能会降低性能 🐌!

六、 适配器模式的应用场景

  • 接口转换: 将一个类的接口转换成客户希望的另外一个接口 🔌!
  • 数据转换: 将一种格式的数据转换成另外一种格式的数据 🗂️!
  • 遗留系统集成: 将新的系统和旧的系统集成在一起 🤝!
  • 第三方库集成: 将第三方库集成到你的项目中 📚!

七、 总结

  • 适配器模式就像插座转换器,让不兼容的接口也能愉快玩耍! 🔌
  • 主要分为类适配器模式、对象适配器模式和接口适配器模式三种! 🤸
  • 优点是提高类的复用性、提高系统的灵活性、符合开闭原则、解耦! 👍
  • 缺点是增加复杂度、可能降低性能! 👎
  • 适用于需要解决接口不兼容的问题的场景! 🎯

希望这篇文章能让你彻底理解适配器模式! 💯 祝你学习愉快! 😄
看完请看:(八)趣学设计模式 之 装饰器模式!

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

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

相关文章

【NLP】注意力机制

目录 一、认识注意力机制 1.1 常见注意力计算规则 1.2 注意力机制的作用 1.3 注意力机制代码实现 二、注意力机制原理 2.1 attention计算过程 2.2 attention的计算逻辑 2.3 有无attention模型对比 2.3.1 无attention机制的模型 2.3.2 有attention机制的模型 三、Se…

Spring Boot 整合 Druid 并开启监控

文章目录 1. 引言2. 添加依赖3. 配置数据源4. 开启监控功能5. 自定义 Druid 配置(可选)6. 访问监控页面7. 注意事项8. 总结 Druid 是一个由阿里巴巴开源的高性能数据库连接池,它不仅提供了高效的连接管理功能,还自带了强大的监控…

红帽7基于kickstart搭建PXE环境

Kickstart 文件是一种配置文件,用于定义 Linux 系统安装过程中的各种参数,如分区、网络配置、软件包选择等。system-config-kickstart 提供了一个图形界面,方便用户快速生成这些配置文件。 用户可以通过图形界面进行系统安装的详细配置&…

C/C++跳动的爱心

系列文章 序号直达链接1C/C李峋同款跳动的爱心2C/C跳动的爱心3C/C经典爱心4C/C满屏飘字5C/C大雪纷飞6C/C炫酷烟花7C/C黑客帝国同款字母雨8C/C樱花树9C/C奥特曼10C/C精美圣诞树11C/C俄罗斯方块小游戏12C/C贪吃蛇小游戏13C/C孤单又灿烂的神14C/C闪烁的爱心15C/C哆啦A梦16C/C简单…

MongoDB 简介

MongoDB 是一种高性能、开源的 NoSQL 数据库,以其灵活的文档模型和强大的扩展性而闻名。 1.MongoDB 是什么 MongoDB 是一种 NoSQL 数据库,采用 文档模型 存储数据,支持灵活的 JSON 格式文档。它无需预定义表结构,能够动态调整数据…

记录首次安装远古时代所需的运行环境成功npm install --save-dev node-sass

最开始的报错: 最后根据报错一步步 安装所需要的pythong之类的环境,最后终于成功了,得以让我在github上拉的vuehr项目(狗头18年还是20年的远古项目)成功本地运行,最后附上本地运行成功的贴图。如果大家也在…

华为guass在dbever和springboot配置操作

下面记录华为guass在dbever和springboot配置操作,以备忘。 1、安装dbeaver-ce-23.2.0-x86_64-setup.exe和驱动程序 Download | DBeaver Community 2、配置高斯数据库驱动 3、新建数据库连接 4、操作指引 opengauss官方文档 https://docs-opengauss.osinfra.cn/zh…

今日运维之-Mac笔记本python环境问题

1. 问题:MAC升级系统后git报错? Error: Cant create update lock in /usr/local/var/homebrew/locks! Fix permissions by running:sudo chown -R $(whoami) /usr/local/var/homebrew Traceback (most recent call last):11: from /usr/local/Homebrew/…

c3p0、Druid连接池+工具类 Apache-DbUtils (详解!!!)

数据库连接池是在应用程序启动时创建一定数量的数据库连接,并将这些连接存储在池中。当应用程序需要与数据库通信时,它可以向池中请求一个连接,使用完后将连接归还给池,而不是关闭连接。这样可以减少创建和关闭连接的开销&#xf…

数仓搭建实操(传统数仓oracle):DWD数据明细层

数据处理思路 DWD层, 数据明细层>>数据清洗转换, 区分事实表,维度表 全是事实表,没有维度表>>不做处理 数据清洗>>数据类型varchar 变成varchar2, 日期格式统一(时间类型变成varchar2); 字符数据去空格 知识补充: varchar 存储定长字符类型 ; 存储的数据会…

2.1 第一个程序:从 Hello World 开始

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 同大多数编程语言教程一样,本书第一个代码也是输出:Hello world! 这似乎也是惯例。我们也先从这个简单的代码…

2025年02月21日Github流行趋势

项目名称:source-sdk-2013 项目地址url:https://github.com/ValveSoftware/source-sdk-2013项目语言:C历史star数:7343今日star数:929项目维护者:JoeLudwig, jorgenpt, narendraumate, sortie, alanedwarde…

【WSL2】 Ubuntu20.04 GUI图形化界面 VcXsrv ROS noetic Vscode 配置

【WSL2】 Ubuntu20.04 GUI图形化界面 VcXsrv ROS noetic Vscode 配置 前言整体思路安装 WSL2Windows 环境升级为 WIN11 专业版启用window子系统及虚拟化 安装WSL2通过 Windows 命令提示符安装 WSL安装所需的 Linux 发行版(如 Ubuntu 20.04)查看和设置 WS…

7.建立文件版题库|编写model文件|使用boost split字符串切分(C++)

建立文件版题库 题目的编号题目的标题题目的难度题目的描述,题面时间要求(内部处理)空间要求(内部处理) 两批文件构成第一个:questions.list : 题目列表(不需要题目的内容)第二个:题目的描述,题目的预设置…

LabVIEW中CFURL.llb 工具库说明

CFURL.llb 是 LabVIEW 2019 安装目录下 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform\ 路径下的工具库,主要用于处理 LabVIEW 与 URL 相关的操作,涵盖 URL 解析、HTTP 请求发送、数据传输等功能模块,帮助开发者…

网络运维学习笔记 017 HCIA-Datacom综合实验01

文章目录 综合实验1实验需求总部特性 分支8分支9 配置一、 基本配置(IP二层VLAN链路聚合)ACC_SWSW-S1SW-S2SW-Ser1SW-CoreSW8SW9DHCPISPGW 二、 单臂路由GW 三、 vlanifSW8SW9 四、 OSPFSW8SW9GW 五、 DHCPDHCPGW 六、 NAT缺省路由GW 七、 HTTPGW 综合实…

6.✨Python学习价值与优势分析

✨Python 是一种值得深入学习的编程语言,其设计哲学、广泛的应用场景以及强大的社区支持使其成为当今最受欢迎的编程语言之一。以下从多个角度分析为什么 Python 值得深入学习: 1.🦋 简洁易学的语法 Python 以简洁、可读性强著称&#xff0c…

Android Audio其他——数字音频接口(附)

数字音频接口 DAI,即 Digital Audio Interfaces,顾名思义,DAI 表示在板级或板间传输数字音频信号的方式。相比于模拟接口,数字音频接口抗干扰能力更强,硬件设计简单,DAI 在音频电路设计中得到越来越广泛的应用。 一、音频链路 1、模拟音频信号 可以看到在传统的…

Spring AI + Ollama 实现调用DeepSeek-R1模型API

一、前言 随着人工智能技术的飞速发展,大语言模型(LLM)在各个领域的应用越来越广泛。DeepSeek 作为一款备受瞩目的国产大语言模型,凭借其强大的自然语言处理能力和丰富的知识储备,迅速成为业界关注的焦点。无论是文本生…

2.3 变量

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 变量是用来存放某个值的数据,它可以表示一个数字、一个字符串、一个结构、一个类等。变量包含名称、类型和值。在代码中…