16 设计模式之适配器模式(充电器转换案例)
一、适配器模式的定义
适配器模式(Adapter Pattern)是一种结构型设计模式,常用于解决接口不兼容的问题。适配器模式通过引入一个“适配器”类,将一个接口转化为客户端期望的另一种接口,使得原本因接口不兼容而无法交互的类能够正常协作。
适配器模式的目标是让原本不兼容的接口能够一起工作。具体来说,适配器模式通过“适配器类”将源接口(被适配的接口)转换成客户端期望的目标接口,从而使得客户端与源接口可以互相沟通。
今天我们通过一个生活化的例子来讲解适配器模式:假设你有一个中国标准的电器插头,但你在美国旅行时,电源插座与中国的插头不兼容。此时,我们就可以通过适配器模式来解决这一问题,使得电器插头能够适配到美国标准的电源插座上。
二、适配器模式的组成部分
- 目标接口(Target):客户端希望使用的标准接口。在我们的例子中,就是美国的电源插头接口
USPlug。 - 被适配者(Adaptee):现有的接口,它与客户端希望使用的接口不兼容。在例子中就是中国电源插头接口
CNPlug。 - 适配器(Adapter):实现目标接口,并持有被适配者对象。适配器将目标接口的请求转发到被适配者对象,实现接口之间的适配。这里就是
PlugAdapter类。 - 客户端(Client):使用目标接口与系统进行交互。在本例中,就是用美国插头(
USPlug)为电器充电的行为。
三、适配器模式的案例讲解
我们来看一个具体的代码实现,以电源插头适配为例:
1.目标接口:USPlug(美国插头接口)
// 目标接口
public interface USPlug {void chargeInUS(); // 美国标准的充电方法
}
2.被适配者接口:CNPlug(中国插头接口)
// 被适配者接口
public interface CNPlug {void chargeInCN(); // 中国标准的充电方法
}
3.适配器类:PlugAdapter(适配器)
// 适配器类
public class PlugAdapter implements USPlug {private CNPlug cnPlug; // 持有一个中国插头对象// 构造函数,传入中国插头对象public PlugAdapter(CNPlug cnPlug) {this.cnPlug = cnPlug;}// 适配器实现目标接口的充电方法@Overridepublic void chargeInUS() {System.out.println("正在适配...");cnPlug.chargeInCN(); // 调用中国插头的充电方法}
}
4.被适配者实现类:ChinaPlug(中国插头)
// 中国插头实现
public class ChinaPlug implements CNPlug {@Overridepublic void chargeInCN() {System.out.println("使用中国插头充电...");}
}
5.测试类:AdapterPatternTest(客户端)
// 测试类
public class AdapterPatternTest {public static void main(String[] args) {// 客户端使用中国插头的电器CNPlug cnPlug = new ChinaPlug();// 通过适配器将中国插头转换为美国插头USPlug usPlug = new PlugAdapter(cnPlug);// 使用美国插头接口充电usPlug.chargeInUS();}
}
6.实现效果
正在适配...
使用中国插头充电
四、代码执行流程
- 客户端
AdapterPatternTest创建了一个ChinaPlug(中国插头)实例。 - 通过
PlugAdapter(适配器)将ChinaPlug转换为USPlug(美国插头接口)。 - 客户端通过
usPlug.chargeInUS()方法来充电,实际执行的是ChinaPlug的chargeInCN()方法。 - 适配器类(
PlugAdapter)的作用就是将不同的接口适配起来,让原本不兼容的插头能够在美国插座中使用。
五、适配器模式的优缺点
1.优点:
- 解决接口不兼容问题:适配器模式能让两个不兼容的接口能够正常工作,避免了因为接口不一致而导致的系统无法协作的问题。
- 提高系统的灵活性:通过适配器,可以灵活地引入新的插头类型,而不需要修改现有的代码。
- 符合开闭原则:通过扩展适配器类可以方便地适应新类型的插头或接口,而无需修改原有的类。
2.缺点:
- 可能增加系统的复杂性:过多的适配器可能导致类的数量增多,从而增加系统的复杂性。
- 增加了代码的间接性:通过适配器进行间接调用,会使得代码的可读性降低,增加了理解成本。
六、总结
适配器模式是解决接口不兼容问题的强大工具。通过引入适配器类,系统中的各个部分可以不修改原有代码的前提下,实现接口之间的兼容和转换。在实际开发中,适配器模式非常适用于跨平台和系统集成的场景。希望通过本篇博客的示例,你能够清晰理解适配器模式的工作原理及应用场景。
相关文章:
16 设计模式之适配器模式(充电器转换案例)
一、适配器模式的定义 适配器模式(Adapter Pattern)是一种结构型设计模式,常用于解决接口不兼容的问题。适配器模式通过引入一个“适配器”类,将一个接口转化为客户端期望的另一种接口,使得原本因接口不兼容而无法交互…...
基于Java Springboot在线招聘APP且微信小程序
一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 微信…...
多组学数据如何发表高分SCI论文,以RNA-Seq数据为例
随着高通量测序以及生物信息学的发展,R语言在生物大数据分析以及数据挖掘中发挥着越来越重要的作用。想要成为一名优秀的生物数据分析者与科研团队不可或缺的人才,除了掌握对生物大数据挖掘与分析技能之外,还要具备一定的统计分析能力与SCI论…...
Qt Designer Ui设计 功能增加
效果展示 输入密码,密码错误,弹出提示 密码正确,弹出提示并且关闭原窗口 代码(只提供重要关键主代码)lxh_log.py代码: import sysfrom PySide6.QtWidgets import QApplication, QWidget, QPushButtonfrom …...
【Android学习】2024最新版Android Studio安装与配置
准备工作 Windows系统的要求 一、下载 Android Studio官网:https://developer.android.google.cn/studio?hlen 今天是2024年9月27日,Android Studio已经更新到了Koala版本 直接下载 二、安装 笔者当前环境变量中配置的JDK版本为1.8 双击.exe文件运行…...
RabbitMQ延时队列
RabbitMQ延时队列 什么是延时队列 延时队列顾名思义,即放置在该队列里面的消息是不需要立即消费的,而是等待一段时间之后取出消费。 应用场景 场景一:在订单系统中,一个用户下单之后通常有30分钟的时间进行支付,如…...
a8204 基于微信小程序的音乐播放器微信小程序的研究与实现 服务器端Java+Mysql+Servlet 文档 源码
音乐播放微信小程序 1.项目描述2. 绪论3.项目功能4.界面展示5.源码获取 1.项目描述 随着科技的发展,手机在我们生活中起到了重要的作用。软件作为手机重要的一部分,用户体验显得尤为重要。微信小程序一起操作便捷、用户基数大、分享便利、既用即走等特点…...
游戏新纪元:用栈记录数据,轻松实现悔棋功能
游戏介绍 嘿,各位游戏爱好者们!今天我要给大家介绍一款颠覆传统、创新十足的游戏项目。这款游戏不仅让你沉浸在紧张刺激的游戏世界中,还引入了前所未有的两大特色功能:记录游戏数据和轻松实现悔棋。 首先,让我们来聊…...
C/C++基础知识复习(36)
函数重载是指在同一作用域内,定义多个同名但参数列表不同的函数。通过函数重载,程序员可以使用相同的函数名称处理不同类型或数量的参数,而不需要为每种情况创建不同的函数名称。编译器根据函数调用时传递的参数类型和数量来决定调用哪个版本…...
JAVA |日常开发中连接Sqlite数据库详解
JAVA |日常开发中连接Sqlite数据库详解 前言一、SQLite 数据库概述1.1 定义与特点1.2 适用场景 二、Java 连接 SQLite 数据库的准备工作2.1 添加 SQLite JDBC 驱动依赖2.2 了解 JDBC 基础概念 三、建立数据库连接3.1 代码示例3.2 步骤解析 四、执行 SQL 语句4.1 创建…...
Java项目实战II基于微信小程序的消防隐患在线举报系统(开发文档+数据库+源码)
目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着城市化进程的加快&…...
python编程Day12-属性和方法的分类
私有和公有 在python中 定义类的时候,可以给 属性和方法设置 访问权限,即规定在什么地方可以使用。 权限一般分为两种:公有权限、私有权限 公有权限 定义:直接定义的属性和方法就是公有的特点: 可以在任何地方访问和使…...
【unity小技巧】在 Unity 中,Application获取各种文件路径或访问不同类型的存储路径
文章目录 前言1. **Application.persistentDataPath**2. **Application.dataPath**3. **Application.streamingAssetsPath**4. **Application.temporaryCachePath**5. **Application.consoleLogPath**6. **Application.userDataPath**7. **Application.streamingAssetsPath 与 …...
c++:timer
1.设置休眠时间sleep_for 添加头文件 #include <thread> #include <iostream> #include <chrono> #include <thread>int main(int argc, char const *argv[]) {// 休眠2秒std::this_thread::sleep_for(std::chrono::seconds(2));// 休眠500毫秒std:…...
VSCode(四)CMake调试
1. 工具准备 1.1 C环境插件 1.2 CMake插件 2. Cmake工程 2.1 创建项目文件夹 ex:CMAKE_TEST 2.2 创建CMake工程 (shift ctl P), 选择"CMAKE: Quick Start": 2.3 填写project name: (ex: test_cmake) 2.4 选择”Executable“ 项目文件内会自动…...
安装Docker并使用WSL
引言 Windows Subsystem for Linux (WSL) 是一个在Windows上运行Linux二进制可执行文件(ELF格式)的兼容层。它允许开发者直接在Windows上运行Linux环境,而无需使用虚拟机。Docker是一个开源的应用容器引擎,它允许开发者打包应用以…...
HCIA-openGauss_2_2连接与认证
设置客户端认证策略 设置配置文件参数 gssql客户端连接-确定连接信息 客户端工具通过数据库主节点连接数据库,因此连接前,需要获取数据库主节点的在服务器的IP地址及数据库主节点的端口号信息。 步骤1:以操作系统用户omm登录数据库主节点。…...
安装 pytorch lighting
1 搜寻配对版本 进入lighting官网,查看配对版本 比如我就选择Python3.11、torch2.4、lightning2.4.0 2 搜寻pytorch安装命令 进入pytorch官网,查看以前版本的下载命令 注意要选择是 gpu版本的pytorch查看自己显卡驱动命令:nvidia-smi查看…...
2024年12月7日历史上的今天大事件早读
1732年12月07日英国皇家大剧院在伦敦开幕 1798年12月07日清代诗人袁枚逝世 1889年12月07日第一个充气轮胎受专利保护 1916年12月07日劳合-乔治出任英国首相 1926年12月07日第一台电冰箱受美国专利保护 1937年12月07日南京保卫战正式打响 1941年12月07日日本偷袭珍珠港 1…...
ORB-SLAM2 ---- 非线性优化在SLAM中的应用(一)
文章目录 一、为什么要讲非线性优化二、运动模型和观测模型三、最大似然估计四、SLAM中最小二乘的应用五、总结 一、为什么要讲非线性优化 相信大家在学习一段时间SLAM后,会发现两个问题。第一个是代码能看懂,但是不知道为什么这样做(特别是优…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...
解析“道作为序位生成器”的核心原理
解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制,重点解析"道作为序位生成器"的核心原理与实现框架: 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...
