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

二十三种设计模式全面解析-适配器模式的妙用:异构数据库和不同版本API的完美兼容!


在当今的软件开发领域,我们常常面对着与异构数据库和不同版本的API进行集成的挑战。这些系统和组件往往使用不同的数据结构和接口规范,导致我们的代码无法直接与它们进行交互。但是,不要担心!今天,我将向你揭示一个神奇的工具——适配器模式,它可以让异构数据库和不同版本的API实现完美兼容,实现各种不可思议的功能!


前面一篇文章,我们也介绍了什么是适配器模式?以及适配器模式的关键技术点,并简单的举例进行了说明。感兴趣的朋友,可以前往查看:二十三种设计模式全面解析-适配器模式:代码的奇迹之桥,连接你的世界!。


今天我们主要以实际开发过程中的案例-两个异构数据库进行交互、不同版本的API进行集成,来详细讲解适配器的妙用,帮助我们加深对适配器设计模式的理解。


一、两个异构数据库进行交互案例


首先,让我们看第一个例子,假设我们的应用需要同时与两个异构数据库进行交互:MySQL和Oracle。这两种数据库使用不同的查询语言和连接方式,我们无法直接在代码中切换数据库而不修改大量的代码。这时候,适配器模式就能发挥它的魔力!


下面是一个简化的示例代码,展示了如何使用适配器模式将异构数据库进行适配:
// 目标接口
interface Database {void connect();void query(String sql);
}// MySQL数据库类
class MySQLDatabase {public void establishConnection() {System.out.println("Establishing connection to MySQL database...");// 实际的连接逻辑}public void executeQuery(String sql) {System.out.println("Executing MySQL query: " + sql);// 实际的查询逻辑}
}// Oracle数据库类
class OracleDatabase {public void connectToDatabase() {System.out.println("Connecting to Oracle database...");// 实际的连接逻辑}public void executeSQL(String sql) {System.out.println("Executing Oracle SQL: " + sql);// 实际的查询逻辑}
}// MySQL适配器类
class MySQLAdapter implements Database {private MySQLDatabase mySQLDatabase;public MySQLAdapter(MySQLDatabase mySQLDatabase) {this.mySQLDatabase = mySQLDatabase;}public void connect() {mySQLDatabase.establishConnection();}public void query(String sql) {mySQLDatabase.executeQuery(sql);}
}// Oracle适配器类
class OracleAdapter implements Database {private OracleDatabase oracleDatabase;public OracleAdapter(OracleDatabase oracleDatabase) {this.oracleDatabase = oracleDatabase;}public void connect() {oracleDatabase.connectToDatabase();}public void query(String sql) {oracleDatabase.executeSQL(sql);}
}// 客户端代码
public class Main {public static void main(String[] args) {Database mysql = new MySQLAdapter(new MySQLDatabase());mysql.connect();mysql.query("SELECT * FROM users");Database oracle = new OracleAdapter(new OracleDatabase());oracle.connect();oracle.query("SELECT * FROM customers");}
}

通过适配器模式,我们可以将MySQL和Oracle的不兼容接口转换为统一的Database接口,使得我们的代码能够无缝地与这两个异构数据库进行交互。


二、不同版本的API进行集成

接下来,让我们看看如何使用适配器模式实现不同版本的API的兼容性。在软件开发中,API的版本升级是一项常见的任务,但新版本的API往往会引入不兼容的变化,导致我们的代码无法直接升级。这时候,适配器模式再次展现了它的魔力!


假设我们的应用需要与两个版本的某个外部API进行交互:API v1和API v2。这两个版本的API具有不同的方法和参数,我们的代码需要适配以实现兼容性。


下面是一个简化的示例代码,展示了如何使用适配器模式实现不同版本的API的兼容:

// 目标接口
interface ExternalAPI {void performOperation();
}// API v1类
class APIv1 {public void doOperation() {System.out.println("Performing operation in API v1...");// 实际的操作逻辑}
}// API v2类
class APIv2 {public void executeOperation() {System.out.println("Executing operation in API v2...");// 实际的操作逻辑}
}// API v1适配器类
class APIv1Adapter implements ExternalAPI {private APIv1 apiv1;public APIv1Adapter(APIv1 apiv1) {this.apiv1 = apiv1;}public void performOperation() {apiv1.doOperation();}
}// API v2适配器类
class APIv2Adapter implements ExternalAPI {private APIv2 apiv2;public APIv2Adapter(APIv2 apiv2) {this.apiv2 = apiv2;}public void performOperation() {apiv2.executeOperation();}
}// 客户端代码
public class Main {public static void main(String[] args) {ExternalAPI api1 = new APIv1Adapter(new APIv1());api1.performOperation();ExternalAPI api2 = new APIv2Adapter(new APIv2());api2.performOperation();}
}

通过适配器模式,我们可以将API v1和API v2的不兼容接口转换为统一的ExternalAPI接口,使得我们的代码能够无缝地与这两个不同版本的API进行交互。


总结:

适配器模式是一个强大而灵活的工具,能够实现异构数据库和不同版本的API的兼容性。通过引入适配器,我们可以在无需修改大量代码的情况下,实现与这些不兼容的系统和组件的无缝集成。


好了,今天的分享到此结束。如果觉得我的博文帮到了您,您的点赞和关注是对我最大的支持。如遇到什么问题,可评论区留言。


相关文章:

二十三种设计模式全面解析-适配器模式的妙用:异构数据库和不同版本API的完美兼容!

在当今的软件开发领域,我们常常面对着与异构数据库和不同版本的API进行集成的挑战。这些系统和组件往往使用不同的数据结构和接口规范,导致我们的代码无法直接与它们进行交互。但是,不要担心!今天,我将向你揭示一个神奇…...

K7系列FPGA进行FLASH读写1——CCLK控制(STARTUPE2原语)

最近的工作涉及对 FPGA 进行远程更新,也就是通过远程通信接口将 .bin 文件送到 FPGA,然后写入 FLASH,这样当 FPGA 重新上电后就可以执行更新后的程序了。因此第一步工作就是进行 FLASH 的读写控制。 然而如果尝试配置 FLASH 管脚时&#xff0…...

【Kafka】基本概念

文章目录 一、消息队列的流派1.1 有Broker1.1.1 重topic1.1.2 轻topic 1.2 无Broker 二、kafka安装三、kafka基本术语四、发送消息五、消费消息六、单播消息七、多播消息八、查看消费组的详细信息九、主题topic十、分区十一、kafka中消息⽇志⽂件中保存的内容 一、消息队列的流…...

如何在Vue3项目中使用防抖节流技巧

前言 防抖节流是可以说是一种优化组件性能的技巧,可以有效减少组件中的渲染次数和计算量,从而提高组件的响应速度和用户体验。在Vue3中可以使用lodash库中的debounce和throttle函数来分别实现防抖和节流。当然也可以自行设计实现防抖节流函数&#xff0…...

快速排序(Java)

基本思想 快速排序Quicksort)是对冒泡排序的一种改进。 基本思想是分治的思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排…...

在ffmpeg中,如何把h264转换为rgb格式

在ffmpeg中,网络视频流h264为什么默认的转为YUV而不是其他格式 文章中介绍了,h264解码的时候是直接解码为yuv的,如果在使用的过程中 需要用到rgb的格式,我们该如何来转换这种格式呢? 在上面的文章中,我们已…...

【重磅】Cookies、headers、Session规律总结,搞定卡点

【重磅】Cookies规律总结,搞定卡点 登录后开始正式获取数据阶段: 不使用session: 放在请求头headers中 当如是:headers = {“user-agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36”,“Coo…...

【雷达原理】雷达杂波抑制方法

目录 一、杂波及其特点 1.1 什么是杂波? 1.2 杂波的频谱特性 二、动目标显示(MTI)技术 2.1 对消原理 2.2 数字对消器设计 三、MATLAB仿真 3.1 对消效果验证 3.2 代码 一、杂波及其特点 1.1 什么是杂波? 杂波是相对目标回波而言的,…...

Python-敲木鱼升级版(真手动版敲木鱼)

演示效果 需要安装的第三方库: pip install pygame # 加载音乐 pip install pillow # 加载图片 pip install mediapipe # 判断手势的模型 pip install opencv # 模型要用来处理图形 建议有独显和摄像头的可以尝试! 想着升级一下玩法,只有真敲…...

Websocket @ServerEndpoint不能注入@Autowired

在websocket中使用ServerEndpoint无法注入Autowired、Value 问题分析 Spring管理采用单例模式(singleton),而 WebSocket 是多对象的,即每个客户端对应后台的一个 WebSocket 对象,也可以理解成 new 了一个 WebSocket&…...

Unity热更新

1,热更新的概念与作用 app更新通常分为两类,一种是整包更新(换包),一种是热更新(不换包,通过网络下载,动态更新资源等)。 整包更新,是指在需要更新时&#x…...

如何用维格云搭建和一键训练你的钧瓷AI机器人?

大禹智库 第69期(总第400期) 2023年11月4日 如何用维格云搭建和一键训练你的钧瓷AI机器人? 钧瓷私有数据聊天机器人是一种能够根据预设的数据集进行智能对话的机器人。通过维格云,我们可以轻松地搭建自己的钧瓷私有数据聊天机器人。本文将以钧道机器人为例,详细介绍如何…...

整理的一些Java细节问题

1. 为什么要有无参构造? 在 Java 中,如果一个类没有显式定义构造方法,编译器会自动生成一个默认的无参构造方法(也称为默认构造方法)。无参构造方法是一个没有任何参数的构造方法。 无参构造方法的存在有几个重要原因…...

初识AUTOSAR网络管理

文章目录 目的模式时间参数T_REPEAT_MESSAGET_NM_TIMEOUTT_WAIT_BUS_SLEEPT_START_Tx_AppFrameT_NM_ImmediateCycleTimeT_NM_MessageCycleN_ImmediateNM_TIMEST_START_NM_TXT_WakeUp跳转状态NM_1NM_2NM_3NM_4NM_5NM_6NM_7...

Flink SQL Hive Connector使用场景

目录 1.介绍 2.使用 2.1注册HiveCatalog 2.2Hive Read 2.2.1流读关键配置 2.2.2示例...

【Docker】联合探讨Docker:容器化技术的革命性应用

前言 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 📕作者简介:热…...

dirhunt使用手册,中文版

“dirhunt” 的命令行工具的帮助信息,用于目录扫描和网站内容分析。以下是这个命令的使用方法和示例: 命令格式: dirhunt [OPTIONS] [URLS]… [URLS]…:一个或多个域名或 URL,可以加载来自文件的 URL,使用…...

【从0到1设计一个网关】如何设计一个稳定的网关?

文章目录 高可用分析软件架构心跳检测自动恢复熔断降级接口重试隔离压测和预案多机房灾备以及双活数据中心异常处理机制重试主备服务自动切换动态剔除或恢复异常机器超时时间的考虑服务设计这篇文章并没有具体的业务实现,而只是对于如何设计一个高可用,稳定的网关列举出了一些…...

chromedp库编写程序

步骤1:首先,我们需要导入chromedp库,以便使用它来下载网页内容。 import chromedp 步骤2:然后,我们需要创建一个函数,该函数接受一个URL作为参数,并使用chromedp库下载该URL的内容。 func do…...

pngquant failed to build, make sure that libpng-dev is installed 问题

第一个参考方案失败 :npm install -g windows-build-tools4.0.0 安装失败,提示 依赖不在支持 第二个方案,降低node 版本 失败 第三种方案,成功 先执行,下面两行代码,再按照依赖 npm install imagemin-pn…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

docker 部署发现spring.profiles.active 问题

报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...