代理模式和适配器模式区别
代理模式 vs 适配器模式 完整详解核心区别一、先分别吃透两种模式本质1. 适配器模式Adapter结构型核心目的做「转换兼容」两个已有接口不匹配通过适配器做一层接口转换让原本不能协作的两类代码一起工作。关键词兼容、翻译、转换、统一接口角色目标接口 Target我方程序期望调用的统一接口被适配者 Adaptee已有旧接口/第三方类方法名、参数和我方不匹配适配器 Adapter包装 Adaptee实现 Target内部做参数、方法转发转换类比转换插头插座是标准Target国标三脚国外电器是Adaptee美标两脚适配器插头做转换让电器插上插座。两种实现类适配器继承被适配类 实现目标接口Java单继承很少用对象适配器组合持有被适配对象主流2. 代理模式Proxy结构型核心目的做「控制增强」用一个代理类包装原始目标对象对外暴露完全一模一样的接口不修改原有接口定义在方法前后增加额外逻辑权限、缓存、日志、延时创建、远程调用。关键词控制、增强、拦截、中介、透明访问角色抽象主题 Subject原始对象与代理共同实现的统一接口真实对象 RealSubject业务核心对象代理 Proxy实现同一接口持有真实对象拦截所有方法类比中介/经纪人明星RealSubject和经纪人Proxy对外联系方式完全一致都能接演出但经纪人会做前置筛选报价、后置签合同明星只负责表演。常见分类静态代理手写代理类动态代理JDK动态代理、CGLIBSpring AOP底层就是动态代理远程代理、虚拟代理、保护代理、缓存代理二、最核心本质差异一句话区分适配器接口不一样做转换解决「不兼容」对外提供新接口抹平新旧/第三方接口差异使用者看不到原始类接口。代理接口完全一样做增强控制访问对外和原始对象完全相同接口使用者无感知透明调用只附加额外逻辑。关键分水岭接口是否改变调用方期望的接口 ≠ 原始类接口 → 适配器调用方期望的接口 原始类接口 → 代理三、分层详细对比1. 设计目标不同适配器打通两套不兼容接口复用已有第三方/旧代码不用修改原有代码。场景老系统接口、第三方SDK、不同组件整合。代理在不改动原对象代码前提下对原有功能进行拦截、增强、管控。场景权限校验、日志、缓存、懒加载、远程RPC、事务、限流。2. 对外暴露接口适配器适配器实现全新的目标接口Target内部调用被适配者Adaptee的异构方法。外部调用Adapter的是一套新方法名和Adaptee方法名完全不同。示例Targetpay(amount)Adaptee第三方支付transferMoney(money, channel)Adapter内部pay()里转换参数调用transferMoney()代理代理和真实对象实现同一个接口Subject方法名、参数、返回值完全一致。外部调用Proxy的方法和直接调用RealSubject无任何区别。示例统一接口queryOrder(Long id)Proxy.queryOrder() 先查缓存无缓存再调用 RealSubject.queryOrder()3. 与被包装对象的关系适配器被包装的 Adaptee 是外部/老旧异构组件本来就不适合当前系统调用规范两者设计初衷无关。适配器是翻译官。代理被包装的 RealSubject 是系统核心业务对象本身完全满足业务功能只是需要附加控制逻辑。代理是保镖/中介。4. 是否改变调用行为适配器核心逻辑委托给被适配者适配器只做参数、格式转换不新增额外横切逻辑。没有前置校验、缓存、日志这类增强仅做格式翻译。代理核心逻辑依然委托真实对象但会增加前后附加逻辑前置权限校验、参数校验、缓存查询后置日志记录、耗时统计、事务提交5. 代码示例直观区分示例1适配器接口不匹配转换// 目标接口系统统一支付标准publicinterfacePayment{voidpay(BigDecimalmoney);}// 第三方老支付SDK接口不兼容publicclassOldThirdPay{publicvoidtransfer(BigDecimalcash,Integertype){System.out.println(第三方转账cash);}}// 适配器统一转换成Payment接口publicclassPayAdapterimplementsPayment{privateOldThirdPayadapteenewOldThirdPay();Overridepublicvoidpay(BigDecimalmoney){// 转换参数适配第三方接口adaptee.transfer(money,1);}}// 使用业务只认Payment完全不知道OldThirdPay存在PaymentpaynewPayAdapter();pay.pay(newBigDecimal(100));示例2代理接口完全一致增加缓存增强// 统一抽象接口publicinterfaceOrderService{OrdergetOrder(Longid);}// 真实业务类publicclassOrderServiceImplimplementsOrderService{OverridepublicOrdergetOrder(Longid){// 查询数据库returndb.selectById(id);}}// 缓存代理接口完全一致publicclassOrderProxyimplementsOrderService{privateOrderServicerealnewOrderServiceImpl();privateMapLong,OrdercachenewHashMap();OverridepublicOrdergetOrder(Longid){// 前置增强缓存拦截if(cache.containsKey(id)){returncache.get(id);}Orderorderreal.getOrder(id);// 后置增强放入缓存cache.put(id,order);returnorder;}}// 使用方式和原对象完全一致上层无感知OrderServiceservicenewOrderProxy();service.getOrder(1001L);6. 适用业务场景对比适配器典型场景整合第三方SDK微信/支付宝老版本接口、OSS存储、第三方短信新旧系统兼容老数据库DAO、遗留接口适配新业务框架统一多类异构工具多种日志组件、多种文件存储适配统一工具类不同协议转换HTTP接口适配内部RPC调用格式代理典型场景动态代理做AOP日志、切面、事务、限流、权限校验Spring核心缓存代理数据库查询加本地缓存、Redis缓存虚拟代理大图片/大文件延迟加载用到才创建真实对象保护代理接口访问权限校验未登录拦截调用远程代理RPC客户端代理屏蔽网络通信细节Dubbo/Feign静态代理封装工具类增加统一异常处理7. 优缺点与取舍适配器优点快速兼容异构代码无需修改第三方/遗留类统一对外调用标准。缺点仅做转换无法统一增加横切增强逻辑。代理优点无侵入增强原有业务上层调用零改动动态代理可统一批量切面处理。缺点只能用于接口匹配的场景不能解决接口不兼容问题。四、表格汇总对比对比维度适配器模式Adapter代理模式Proxy核心职责接口转换、兼容异构组件透明拦截、功能增强、访问控制对外接口提供全新目标接口与被包装对象接口不同和原始对象完全相同接口方法签名一致设计关系解决「接口不匹配」问题不改变接口附加额外逻辑类比转换插头、翻译官经纪人、中介、保镖包装对象第三方/遗留异构类系统原生标准业务对象附加逻辑仅参数/格式转换无横切增强缓存、日志、权限、事务、延时加载上层感知上层只依赖Target看不到原始类上层完全无感知像直接调用原对象典型框架应用SpringMVC HandlerAdapter、集合工具适配Spring AOP动态代理、Dubbo远程代理五、极易混淆的边界场景区分技巧场景1如果我包装后方法名变了 → 适配器需要把sendMsg(String phone,String content)改成系统统一sendSms(SmsDTO dto)参数结构重组一定是适配器。场景2包装后方法名、参数完全不变只是加日志/缓存 → 代理getUser(Long id)前后加打印耗时、缓存查询接口一丝不动一定是代理。场景3同时需要转换增强怎么处理分层组合外层代理做增强内层适配器做转换调用链路Controller → Proxy日志/权限→ Adapter接口转换→ 第三方SDK六、一句话记忆口诀接口不一样要兼容用适配器接口一模一样要增强用代理。

相关新闻

免费开源视频下载神器:5分钟掌握VideoDownloadHelper终极使用指南

免费开源视频下载神器:5分钟掌握VideoDownloadHelper终极使用指南

免费开源视频下载神器:5分钟掌握VideoDownloadHelper终极使用指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 还在为网页视频…

2026/7/10 1:15:08阅读更多 →
3步快速解决Windows系统卡顿问题:Windows Cleaner完全指南

3步快速解决Windows系统卡顿问题:Windows Cleaner完全指南

3步快速解决Windows系统卡顿问题:Windows Cleaner完全指南 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 你的电脑是否经常在关键时刻卡顿&#xff1…

2026/7/10 1:15:08阅读更多 →
【Android Performance】DDR内存频率查看与固定频点实战操作手册

【Android Performance】DDR内存频率查看与固定频点实战操作手册

文章目录 Android系统性能调优:DDR内存频率查看与固定频点实战操作手册 导入语 1 ~> 三条核心命令速览 2 ~> 命令详解:关闭 / 开启自动变频 2.1 命令格式 2.2 它到底在控制什么 2.3 什么时候需要关闭它 2.4 注意事项 3 ~> 命令详解:手动固定 DDR 频点 3.1 命令格式…

2026/7/10 1:15:08阅读更多 →
海信电视系统精简风险规避指南:5个关键包与 2 种恢复方案

海信电视系统精简风险规避指南:5个关键包与 2 种恢复方案

海信电视系统精简风险规避指南:5个关键包与2种恢复方案 当智能电视逐渐成为家庭娱乐中心,系统预装应用和广告却让用户体验大打折扣。海信电视用户常面临开机广告泛滥、系统卡顿等问题,而精简系统成为提升使用体验的有效手段。但不当操作可能导…

2026/7/10 3:40:58阅读更多 →
缺少用户行为数据分析?2026 十大云流化 PaaS 后台运营管控手册

缺少用户行为数据分析?2026 十大云流化 PaaS 后台运营管控手册

摘要:实时云渲染的算力与数据集中在云端,后台运营却常常缺少对用户行为的系统分析。当点击、停留、交互偏好这些数据只是静默流过,运营决策就失去了最直接的依据。本文从十个维度梳理云流化PaaS平台的后台管控要点,帮助团队把数据…

2026/7/10 3:40:58阅读更多 →
LangChain与LangGraph的生存逻辑:调试、状态与演进三大挑战

LangChain与LangGraph的生存逻辑:调试、状态与演进三大挑战

1. 这个问题背后,藏着整个LLM应用开发者的焦虑“LangChain、LangGraph会消亡吗?”——看到这个标题,我下意识点开不是因为好奇技术命运,而是手边正卡在一个Agent流程调试上:状态机跳转异常、检查点丢失、重试逻辑死循环…

2026/7/10 3:40:58阅读更多 →
题解代码质量自动评分:从正确性到可读性的多维评估体系

题解代码质量自动评分:从正确性到可读性的多维评估体系

题解代码质量自动评分:从正确性到可读性的多维评估体系 一、代码能跑 ≠ 代码值得参考 AI 生成的题解代码,通过沙箱评测只能回答一个问题:「这段代码对不对?」。但作为题解,它还需要回答更多问题:可读性好…

2026/7/10 3:40:58阅读更多 →
让每个客户的“不一样”,都有自己的答案——2026方寸无忧新产品文枢平台发布会在京举行

让每个客户的“不一样”,都有自己的答案——2026方寸无忧新产品文枢平台发布会在京举行

7月9日,2026北京方寸无忧科技发展有限公司新产品发布会在北京星地中心举行,正式发布面向千行百业的“方寸文枢平台”。方寸无忧新产品发布会现场北京朝阳园管委会产业一处副处长马慧,北京致远互联软件股份有限公司董事长徐石,拓尔…

2026/7/10 3:40:58阅读更多 →
TM4C1294与DTH-08的GPIO上拉下拉配置实践

TM4C1294与DTH-08的GPIO上拉下拉配置实践

1. 项目背景与硬件选型解析在嵌入式系统开发中,信号的上拉/下拉配置是确保电路稳定工作的基础操作。DTH-08作为一款多功能数字信号调理模块,与TM4C1294NCPDT微控制器的组合,为开发者提供了灵活的GPIO状态控制方案。这套组合特别适合需要频繁切…

2026/7/10 3:35:58阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/9 5:56:19阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/9 9:45:20阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/9 2:47:07阅读更多 →
浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比

浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比

浏览器缓存行为深度解析:Chrome/Firefox/Safari 对 304 响应的 5 种触发场景对比当你在浏览器地址栏敲入一个网址时,背后可能隐藏着一场关于"要不要重新下载资源"的精密博弈。这场博弈的裁判是HTTP缓存机制,而304状态码则是这场博弈…

2026/7/10 0:00:01阅读更多 →
RoboWits:面向创造性问题求解的双臂机器人认知推理基准

RoboWits:面向创造性问题求解的双臂机器人认知推理基准

1. 项目概述:这不是又一个机器人抓取数据集,而是一次对“思考力”的压力测试 RoboWits——这个名字里藏着两个关键信号:“Robo”直指物理世界中的具身智能体,“Wits”则毫不掩饰地指向人类最核心的认知能力:机敏、判断…

2026/7/10 0:00:01阅读更多 →
5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能

5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能

5分钟完全指南:如何使用TegraRcmGUI图形化工具解锁Switch无限可能 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI TegraRcmGUI是一款专为Windows…

2026/7/10 0:00:01阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/9 9:45:20阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/9 15:50:44阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/9 14:14:17阅读更多 →