23种设计模式-结构型模式-适配器
文章目录
- 简介
- 场景
- 问题
- 解决方案
- 建立中间转换层
- 关键收益
- 总结
简介
使接口不兼容的类实现协同工作,通过引入中间层实现客户端接口和服务端接口的兼容。典型场景比如整合第三方类库或遗留系统时保持代码兼容。

场景
假设你正在开发一个股票监控程序。这个程序会下载股票数据(XML格式),然后为用户显示图表。
现在,需要集成第三方分析库来分析股票数据。但分析库只能接收 JSON 格式的数据。

你可以更改库让他支持XML格式数据。但是,这可能会破坏已经依赖这个库的现有代码。况且你可能都没办法拿到这个库的源代码。
问题
- 接口不匹配:客户端调用规则与现有服务类接口无法直接通信(如XML需转JSON)
- 保护现有代码:无法修改第三方/遗留代码,避免侵入性改造(比如封闭系统或缺乏源码)
解决方案
你可以创建一个适配器。它是一个特殊的对象,可以转换一个对象的调用接口,来让另一个对象可以很方便的调用它。
适配器会包装其中一个对象,来隐藏幕后转换的复杂性。被包装的对象甚至不知道适配器的存在。
适配器不仅可以把数据转换为各种格式,还可以帮助具有不同接口的对象进行协作。它是咋做到的呢?
- 适配器实现了一个与现有对象之一兼容的接口。
- 使用这个接口,现有的对象可以安全地调用适配器的方法。
- 接收到调用后,适配器把请求传递给第二个对象,但采用的是第二个对象期望的格式和调用顺序。
有时甚至可以创建一个双向适配器,可以在两个方向上转换调用。
让我们回到我们的股票监控程序。为了解决格式不兼容的难题,我们为分析库的每个类创建 XML 到 JSON 的适配器。然后,你可以调整你的代码,只通过这些适配器与三方库通信。当适配器收到调用时,它会把传入的 XML 数据转换为 JSON 数据,然后调用被包装的对象的相应方法。

建立中间转换层
- 定义客户端协议接口,强制适配器实现该约定
public interface ClientInterface {void execute(String params);
}
- 适配器持有服务实例引用,进行数据转换和委托调用
public class ServiceAdapter implements ClientInterface {private ThirdPartyService service;public ServiceAdapter(ThirdPartyService service) {this.service = service; // 包装服务对象}@Overridepublic void execute(String params) {JSON jsonData = convertToJson(params); // 接口格式转换service.process(jsonData); // 调用实际服务方法}
}
关键收益
- 客户端零修改:符合开闭原则,新增适配器不影响现有业务逻辑
- 统一管控入口:集中处理协议转换和异常,降低重复代码率
总结

- 客户端Client:是一个包含现有业务逻辑的类。
- 客户端接口Client Interface:描述了其他类必须遵循的协议,这样才能和客户端代码协作。
- Service:是一些有用的类(通常是第三方或遗留的)。客户端不能直接使用这个类,因为它的接口不兼容客户端的调用方式。
- 适配器Adapter:是一个能够跟 Client和Service 一起工作的类,也就是实现Client Interface,同时包装Service对象。Adaptor通过Client Interface接收来自Client的调用,并把它转换成对Service对象的调用,同时转换成它能理解的数据格式。
- 客户端代码只需通过接口与适配器交互就可以了,不需要和具体的适配器类耦合。所以,你可以向程序里添加新类型的适配器而不修改现有的代码。这种情况在Service类的接口被更改或替换时非常有用,因为不需要修改客户端代码就可以创建新的适配器类。
相关文章:
23种设计模式-结构型模式-适配器
文章目录 简介场景问题解决方案建立中间转换层关键收益 总结 简介 使接口不兼容的类实现协同工作,通过引入中间层实现客户端接口和服务端接口的兼容。典型场景比如整合第三方类库或遗留系统时保持代码兼容。 场景 假设你正在开发一个股票监控程序。这个程序会下…...
美亚科技业绩波动明显:现金流为负,四起未决诉讼涉金额1700万
《港湾商业观察》施子夫 近期,广东美亚旅游科技集团股份有限公司(以下简称,美亚科技)披露第二轮审核问询函的回复。从两轮问询函监管层提出的问题来看,有关美亚科技业绩增长的合理性、募投项目的必要性及合理性、经营…...
PyTorch 深度学习实战(21):元强化学习与 MAML 算法
一、元强化学习原理 1. 元学习核心思想 元强化学习(Meta-RL)旨在让智能体快速适应新任务,其核心是通过任务分布学习共享知识。与传统强化学习的区别在于: 对比维度传统强化学习元强化学习目标解决单一任务快速适应任务分布中的…...
23中设计模式-迭代器(Iterator)设计模式
迭代器设计模式 🚩什么是迭代器设计模式?🚩迭代器设计模式的特点🚩迭代器设计模式的结构🚩迭代器设计模式的优缺点🚩迭代器设计模式的Java实现🚩代码总结🚩总结 🚩什么是…...
Word中公式自动标号带章节编号
(1)插入一行三列的表格,设置宽度分别为0.5,13.39和1.5,设置纵向居中,中间列居中对齐,最右侧列靠右对齐,设置段落如下 (2)插入域代码 【Word】利用域代码快速实…...
基于动态 FOF(基金中的基金)策略的基金交易推荐系统的设计与实现思路
下面为你呈现一个基于动态 FOF(基金中的基金)策略的基金交易推荐系统的设计与实现思路,同时给出一个简单的 Python 示例代码。 系统设计 1. 需求分析 收集各类基金的历史数据,涵盖净值、收益率、风险指标等。依据动态 FOF 策略…...
【Spring AI】基于专属知识库的RAG智能问答小程序开发——功能优化:用户鉴权主体功能开发
系列文章目录 【Spring AI】基于专属知识库的RAG智能问答小程序开发——完整项目(含完整前端后端代码)【Spring AI】基于专属知识库的RAG智能问答小程序开发——代码逐行精讲:核心ChatClient对象相关构造函数【Spring AI】基于专属知识库的R…...
[7-01-03].SpringBoot3集成MinIo
MinIO学习大纲 一、Spingboot整合MinIo 第1步:搭建SpringBoot项目: 第2步:引入minio依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi&q…...
ISIS-3 LSDB链路状态数据库同步
上一章我们介绍了ISIS的邻居建立关系以及ISIS的路由器角色有哪些,在不同的网络类型当中建立邻居关系有什么不同,并且以实验案例抓包的形式给大家进一步介绍了建立的过程。 这一章我们来介绍ISIS中是如何实现链路状态数据库同步的,与OSPF的链路状态同步有什么不同,在不同网络类…...
快速入手-基于Django的Form和ModelForm操作(七)
1、Form组件 2、ModelForm操作 3、给前端表单里在django里添加class相关属性值 4、前端 5、后端form 新增数据处理 6、更新数据处理...
Springboot集成Debezium监听postgresql变更
1.创建springboot项目引入pom <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>io.debezium</groupI…...
Ubuntu22.04搭建freeradius操作说明
Ubuntu22.04搭建freeradius操作说明 更新依赖库 sudo apt update sudo apt install build-essential sudo apt install libtalloc-dev sudo apt install libssl-dev 按照freeradius sudo apt install freeradius 修改freeradius配置 文件路径如下 /etc/freeradius/3.…...
【重装系统】全流程记录,在 MacOS 的电脑上烧录 Ubuntu 启动盘
背景 Ubuntu 无法联网,排查下来应该是网卡驱动的问题,安装驱动的过程中又缺失各种包需要网络,陷入死循环。 全流程以及相关资料 整体流程参考:【史上最全】重装ubuntu20.04系统基本环境配置 烧录启动盘启动盘插入需要重装的服务…...
去中心化金融
什么是去中心化金融 去中心化金融(Decentralized Finance,简称 DeFi)是一种基于区块链技术构建的金融系统,旨在通过去除传统金融机构(如银行、证券公司等)作为中介,提供各种金融服务。这些服务…...
centos 7 部署FTP 服务用shell 脚本搭建
#!/bin/bash# 检查是否以root身份运行脚本 if [ "$EUID" -ne 0 ]; thenecho "请以root身份运行此脚本。"exit 1 fi# 安装vsftpd yum install -y vsftpd# 启动vsftpd服务并设置开机自启 systemctl start vsftpd systemctl enable vsftpd# 配置防火墙以允许F…...
VMware启动虚拟机报“另一个程序已锁定文件的一部分,进程无法访问”
解决方案: 1)定位到虚拟机磁盘目录,我这里是“E\VM_Disk\CactiEZ\”这个目录,每个人目录不一样,详见上图报错位置 2)在这个目录中找到后缀名以“.lck”结尾的目录,将所有以 .lck 结尾的目录删…...
Python基础(正则表达式)
正则表达式使用 在 Python 中,使用 re 模块来处理正则表达式 re.match函数 import re print(re.match(www, www.baidu.com).span()) #.span():获取匹配对象的起始和结束索引,以元组形式返回 print(re.match(com, www.baidu.com))line &q…...
CPU架构和微架构
CPU架构(CPU Architecture) CPU架构是指处理器的整体设计框架,定义了处理器的指令集、寄存器、内存管理方式等。它是处理器设计的顶层规范,决定了软件如何与硬件交互。 主要特点: 指令集架构(ISA, Instr…...
基于Zookeeper的微服务配置管理与灰度发布实战指南
引言 在分布式系统中,服务注册与发现、配置管理以及平滑发布是保障系统高可用性的关键。Apache Zookeeper作为一款成熟的分布式协调服务,结合Spring Cloud生态,能够有效解决这些挑战。本文将深入探讨Zookeeper的核心配置参数、服务注册机制&…...
帕金森病致生活艰难,如何缓解心理负担?
你是否留意到身边有人手部不由自主地颤抖,且肢体变得僵硬,行动也愈发迟缓?这很可能是帕金森病的症状。帕金森病是一种常见的神经系统退行性疾病,多发生于中老年人。 静止性震颤往往是帕金森病的首发症状,患者在安静状…...
使用 fn_dblog手动恢复误操作的 update(单列数值型数据恢复)
使用 fn_dblog手动恢复误操作的 update(单列数值型数据恢复) 事由fn_dblogfn_dblog 列数据意义 事由 通常,我们在操作数据库的时候,很对 update 指令指定一个更新范围,比如指定更新某个ID的数据,指定某个类…...
ambiq apollo3 ADC实例程序注释
#include "am_mcu_apollo.h" // Apollo MCU 外设寄存器定义和HAL库 #include "am_bsp.h" // 板级支持包(引脚定义、LED函数等) #include "am_util.h" // 通用工具函数(如printf重…...
[Windows] Edge浏览器_134.0.3124.83绿色便携增强版-集成官方Deepseek侧边栏
微软Edge浏览器 绿色便携增强版 长期更新 链接:https://pan.xunlei.com/s/VOMA-aVC_GPJiv-MzRS89lsVA1?pwdemxj# Edge浏览器_134.0.3124.83绿色便携增强版-集成官方Deepseek侧边栏...
Python大数据方向就业
一、基础必备技能 1. Python编程 核心语法:熟练掌握函数、面向对象、异常处理、文件操作等。数据处理库:Pandas(数据清洗、分析)、NumPy(数值计算)、Matplotlib/Seaborn(数据可视化&…...
从零构建大语言模型全栈开发指南:第二部分:模型架构设计与实现-2.2.3实战案例:在笔记本电脑上运行轻量级LLM
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 实战案例:在笔记本电脑上运行轻量级LLM2.2.3 模型架构设计与实现1. 环境与工具准备1.1 硬件要求1.2 软件栈选择2. 轻量级模型架构设计2.1 模型参数配置2.2 关键技术优化3. 实战流程3.1 数据准备流程3.2…...
CAN基础知识学习二
一、控制器局域网总线(CAN,Controller Area Network); 二、CAN FD 是CAN with Flexible Data rate的缩写,翻译为【可变速率的 CAN】 CAN-FD 采用了两种位速率:从控制场中的 BRS 位到 ACK 场之前(…...
新能源行业:卓越 UE/UI 设计,引领业务腾飞的新引擎
在全球积极推动可持续发展的大背景下,新能源行业蓬勃兴起,成为经济发展的新引擎。在这个充满机遇与挑战的赛道上,优秀的用户体验(UE)和用户界面(UI)设计正扮演着愈发关键的角色,它不…...
Webview详解(上)
第一阶段:基础入门 WebView基础概念 什么是Webview? WebView是一种用于在移动应用程序中展示网页内容的嵌入式浏览器组件。它允许开发者将网页内容直接加载到应用界面中,用户无需离开应用即可浏览网页。WebView 通常用于加载 HTML、CSS、J…...
Docker镜像相关命令(Day2)
文章目录 前言一、问题描述二、相关命令1.查看镜像2.搜索镜像3.拉取镜像4.删除镜像5.镜像的详细信息6.标记镜像 三、验证与总结 前言 Docker 是一个开源的容器化平台,它让开发者能够将应用及其依赖打包到一个标准化的单元(容器)中运行。在 D…...
C++值传递和引用传递
系列文章目录 值传递和引用传递是 C 中两种常见的参数传递方式,它们的主要区别在于函数内部对参数的操作是否会影响原始数据 C值传递和引用传递 系列文章目录1、值传递2、引用传递3 、常量引用传递4、值传递 vs 引用传递总结 1、值传递 值传递会复制传入的参数&…...
