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

设计模式[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秒看懂,工作中天天用!搞定!

http://www.cnnetsun.cn/news/1550.html

相关文章:

  • C++ 的本质·第6篇 异常安全与错误处理
  • C++的现代之路(六):C++20 核心支柱(下)—— Concepts 与 Ranges 库
  • 轻历史·第九讲:GPU
  • NVIDIA GPU 发展历程里程碑(1999 年至今)
  • 游戏开发软件有哪些?一站式汇总,助力自主开发
  • redis(hash)使用场景
  • redis实现分布式锁
  • 【踩坑记录】pandas.to_sql 报 “‘Engine‘ object has no attribute ‘cursor‘”,最后竟然是环境问题
  • 汇编:外设连接与中断
  • 为何要配光伏储能协调控制服务器?核心价值与应用必要性
  • 优选算法-004 盛最多水的容器
  • 一个构建指定坐标轴在默认点(0,0)的构造方法《python语言程序设计》2018版--第8章17题第2部分
  • 知识点总结
  • 初级电气工程师考试题2
  • 【强化学习】第二章:老虎机问题、ε-greedy算法、指数移动平均
  • Oracle数据库内存管理实操指南:PGA与SGA优化实战
  • 1分钟搭建 Redis三主三从集群!附完整自动化脚本(直接复制可用)
  • 在线教程丨30毫秒处理100个检测对象,SAM 3实现可提示概念分割,性能提升2倍
  • 基于web的酒品商城购物系统的设计与实现-计算机毕业设计源码31522
  • 软件代码去个性化是智能制造落地的有效途径
  • 如何了解腾讯云国际站代理商FL有什么跨境优势呢?
  • 开发日志-正点原子RK3568运行Qt项目
  • 萨拉赫如何用一次采访,毁掉自己在利物浦的八年传奇?
  • 18场造14球仍遭弃!巴萨为何对拉什福德关上大门?
  • 如何设计安全的 Web API 访问
  • 算法竞赛备考冲刺必刷题(C++) | AcWing 1169 糖果
  • 算法竞赛备考冲刺必刷题(C++) | 洛谷 P5960 差分约束
  • 工业智能体的五级跃迁:从对话到执行的智能化革命
  • C语言实现isalpha函数功能(附带源码)
  • C语言实现多种方法求解定积分(附带源码)