news 2026/2/28 14:31:22

设计模式[6]——适配器模式,一分钟彻底说清楚

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
设计模式[6]——适配器模式,一分钟彻底说清楚

设计模式[6]——适配器模式,一分钟彻底说清楚

一句话记住:
适配器模式 = 给老东西插一个“转换头”,让它假装成新东西,继续被新代码愉快使用!

生活例子:

  • 美标插头 → 买个国标转换器 → 就能插中国插座
  • HDMI 接口电视 → 用一根 HDMI转VGA 线 → 老投影仪也能用

真实业务场景:
新会员系统要求用register(MemberDTO)注册用户,但老系统只有create_user(username, phone, id_card),参数完全对不上。
我们不想改几百个老调用,也不让新系统改接口 → 只能上适配器!

完整可直接跑的业务代码示例:

fromdataclassesimportdataclassimporttime# 新系统要求的 DTO 和接口@dataclassclassMemberDTO:name:strmobile:strid_number:strsource:str="web"classNewMemberService:defregister(self,member:MemberDTO)->str:"""必须实现这个方法,返回会员号字符串"""pass# 老系统 2018 年写的类(全国几百个地方还在用,不能动!)classLegacyUserService:defcreate_user(self,username:str,phone:str,id_card:str)->int:print(f"[老系统] 正在创建用户:{username}")time.sleep(0.1)return1000000+int(time.time()%10000)# 适配器:核心!让老系统“假装”成新接口classMemberAdapter(NewMemberService):def__init__(self,legacy:LegacyUserService):self.legacy=legacydefregister(self,member:MemberDTO)->str:# 把新 DTO 转成老系统认识的参数old_id=self.legacy.create_user(username=member.name,phone=member.mobile,id_card=member.id_number)# 老系统返回 int,新系统要字符串会员号new_member_id=f"MBR{old_id:010d}"print(f"适配成功 →{old_id}{new_member_id}")returnnew_member_id# 业务代码(完全不知道底层是用老系统还是新系统)defregister_vip(service:NewMemberService):dto=MemberDTO(name="李四",mobile="18812345678",id_number="310101199912120000")mid=service.register(dto)print(f"注册完成,会员号:{mid}\n")# 使用:只差一行代码决定用新还是老if__name__=="__main__":# 现在还得兼容老系统 → 插上适配器adapter=MemberAdapter(LegacyUserService())# 未来换真新系统时,只需要把上面这行换掉就行# adapter = RealNewMemberService()register_vip(adapter)

输出:

[老系统] 正在创建用户:李四 适配成功 → 1003721 → MBR0001003721 注册完成,会员号:MBR0001003721

经典结构图(记这个就终身不忘):

客户端 → 目标接口(NewMemberService) ↑ 适配器 Adapter ↑ 已有的老类(LegacyUserService)

总结三句话:

  1. 新接口不兼容老实现?写个适配器就行
  2. 适配器就是“转换头”,两边接口对得上就完事
  3. 公司里最常见模式之一:对接第三方、系统迁移、历史包袱,全靠它救命!

适配器模式,30秒看懂,工作中天天用!搞定!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/22 9:56:37

C++ 的本质·第6篇 异常安全与错误处理

C 的本质第6篇 异常安全与错误处理:C 的三条铁律 核心命题 为什么 C 异常安全比“不用异常”更重要? 异常安全(Exception Safety)不是关于是否使用 try...catch,而是关于在错误发生时,如何保持程序状态的完…

作者头像 李华
网站建设 2026/2/23 10:19:39

轻历史·第九讲:GPU

轻历史第九讲:GPU 从1999年“游戏显卡”到2025年“AI之神”,英伟达一个人把人类算力抬进了新纪元 一、诞生前的世界(1999年之前) 1999年之前,显卡只是“把画面画出来”的小配角: 3dfx Voodoo:硬…

作者头像 李华
网站建设 2026/2/23 17:49:05

NVIDIA GPU 发展历程里程碑(1999 年至今)

💻 NVIDIA GPU 发展历程里程碑(1999 年至今)GPU型号 (Model Name)发布时间 (Launch Year)架构名称 (Architecture)流处理器数量 (CUDA Cores)FP32 峰值算力 (TFLOPS)目标市场 (Target Segment)首发价格 (MSRP)关键创新/意义GeForce 2561999NV…

作者头像 李华
网站建设 2026/2/27 0:06:45

游戏开发软件有哪些?一站式汇总,助力自主开发

游戏开发不是零散的操作步骤,而是涵盖引擎搭建、美术建模、程序编写、音频制作的完整工程体系,各个环节都需要适配对应的专业软件工具。下文将按核心功能分类,整理主流且实用的工具合集,兼顾独立开发者和大型团队的多样化开发需求…

作者头像 李华
网站建设 2026/2/28 11:10:37

redis(hash)使用场景

redis&#xff08;hash&#xff09;使用场景 1.‌用户信息存储 Service public class UserInfoService {Autowiredprivate RedisTemplate<String, Object> redisTemplate;/*** 保存完整用户信息*/public void saveUserInfo(String userId, Map<String, Object> use…

作者头像 李华