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

什么是适配器模式?一文详解

目录

一.意图

二.结构

三.举例:手机充电

1.不用适配器模式的场景

2.使用适配器模式的场景

3.代码实现

①创建“手机的USB接口”(本质就是一个类)

②创建“TypeC数据线”(本质也是一个类)

③创建“适配器”

最终,进行测试

四.软考真题

1.2016年上半年

题目

分析过程

正确答案


一.意图

将一个类的接口,转换成客户希望的另外一个接口。Adapter(适配器)模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

举例:

当我们的USB插头无法插入typeC接口(或者typeC插头无法插入USB接口),可以接一个适配器,这样就能使用了。

二.结构

举例:用typeC充电器,给USB口的手机(很久之前的老手机)。

三.举例:手机充电

1.不用适配器模式的场景

2.使用适配器模式的场景

3.代码实现

①创建“手机的USB接口”(本质就是一个类)

//目标接口:手机的USB接口 public class USBOfPhone { public void request(){ System.out.println("我是USB接口的手机,需要USB数据线"); } }

②创建“TypeC数据线”(本质也是一个类)

//TypeC数据线 public class TypeC { public void SpecificRequest(){ System.out.println("我是TypeC数据线"); } }

③创建“适配器”

  • 现实生活中,适配器要想实现一遍接TypeC数据线,一遍接手机的USB接口,那就需要事先掌握TypeC和USB二者的协议。
  • 对应到这题中,适配器类Adapter 要想对接好TypeC类和USBOfPhone两个类,就需要先继承USBOfPhone类、并重写USBOfPhone类的request方法,然后在方法中调用TypeC的SpecificRequest方法。
public class Adapter extends USBOfPhone{ //这是关键:在适配器中,要创建一个TypeC的对象 private TypeC typeC = new TypeC(); //重写父类USBOfPhone的方法 @Override public void request(){ //在这里使用typeC的方法 typeC.SpecificRequest(); } }

最终,进行测试

public class Demo01Application { public static void main(String[] args) { //1.这点很重要:左面是USBOfPhone(父类),右边是Adapter(子类),典型的多态思想 USBOfPhone usbOfPhone = new Adapter(); //2.但是usbOfPhone运行时,看的还是右边,即此时运行的是Adapter的那个request方法(最后调用的还是TypeC的SpecificRequest方法) usbOfPhone.request(); } }

运行结果:

如下图,可见我们明明表面调用的是usbOfPhone的request()方法,其实是调用的适配器的request方法(因为usbOfPhone在创建时用的是多态思想,实际创建的是适配器类的对象),而适配器的request方法最后调用的正是TypeC类的SpecificRequest方法。因此才会输出“我是TypeC数据线”。

四.软考真题

1.2016年上半年

题目

分析过程

(1)Address address

这里适配器这个类,已经通过extends DutchAddress连接了DutchAddress,那么就还需要在类中定义一个Address类的对象,达到连接上Address类的目的。这样两边就都和适配器通了,就可以进行适配了。

但是需要注意一点:由于适配器类中,已经给了构造器(可见传参是一个Address类的对象),所以此时在适配器类中定义Address类的对象时,就不需要new了,而是后续在测试类中传入。

故第一空的答案是:Address address


(2)(3)(4)

我们要在适配器类中,重写父类DutchAddress类的三个方法,在方法中实际上要分别调用Address的三个方法(这就是适配器模式的精髓,我们上面也详细讲过)

故:

  • 第二空的答案是:address.street()
  • 第三空的答案是:address.zip()
  • 第四空的答案是:address.city()

(5)DutchAddress addrAdapter = new DutchAddressAdapter(addr)

仍然是多态的思想:

即:创建对象时,左边是父类(即DutchAddress 类),右边是子类(即DutchAddressAdapter适配器类),并且要传入一个Address类的对象给构造器(因为当时在适配器中,只是声明了Address类,而没有具体创建对象,就等着这时候传值呢)

故第五空的答案是:DutchAddress addrAdapter = new DutchAddressAdapter(addr)

正确答案

将我们上述的答案,和下面进行对比,发现全对了。

http://www.jsqmd.com/news/833438/

相关文章:

  • Supabase AI Agent技能库:安全集成数据库操作与边缘函数调用
  • 赊账前先看 6 个信号:怎么提前判断一家工厂会不会跑路、烂尾、收不回货款
  • 从零构建数据同步中间件:插件化架构与工程实践全解析
  • UVa 366 Cutting Up
  • 3个维度重塑:如何用UABEA解锁Unity资源编辑新可能?
  • 前端工程化实战:基于 Kelivo 模板的配置即代码与自动化工作流
  • 猫抓cat-catch:浏览器媒体资源嗅探与流媒体解析技术深度解析
  • SyntaxUI:基于原子设计与Web组件的现代UI库开发实践
  • 利用OCI免费套餐构建高可用Kubernetes集群实战指南
  • 工厂的招工动态能看出哪些经营信息?一份给上游销售员的信号解读手册
  • 百度网盘直链解析终极指南:3步实现高速下载的技术原理与实战
  • 合宙Air153C看门狗芯片:嵌入式系统可靠性的硬件守护方案
  • Gitclaw:封装复杂Git操作,提升开发效率的命令行工具
  • 野火挑战者V2开发板网络通信避坑记:从Ping不通到TCP热插拔,我的STM32F429+LAN8720A调试实录
  • Godot引擎集成Discord RPC:实现游戏状态实时展示与社区互动
  • 基于Plan 9与Lua的9router:构建统一命名空间的网络服务框架
  • DLSS Swapper:游戏性能优化的智能管家,释放显卡潜能的终极利器
  • Copaw_dev:AI编程助手增强框架,提升代码生成与自动化开发效率
  • 开源机械爪OpenClaw:从设计到力控抓取的完整实现指南
  • LVGL在无显存TFT屏上的驱动适配:双缓冲与DMA优化实践
  • 解析开源协作平台tonl:从脚手架到CI/CD的现代Web开发工具链设计
  • 2026康养文旅设计哪家靠谱?行业服务与实践解析 - 品牌排行榜
  • Qdrant客户端库实战:从向量数据库连接到生产级应用开发
  • 从零构建团队技能仓库:结构化知识管理与VuePress实践
  • 2026浙江中铁标准抑尘剂生产厂家好用推荐 - 品牌排行榜
  • 全桥开关电源实验板深度解析:从硬件架构到波形测量与故障排查
  • DevMiser/DaVinci:AI助手成本优化框架的设计与部署实践
  • 树莓派Pico W驱动HDMI仪表盘:物联网数据可视化实战
  • JUCE框架集成AI音频插件:PyTorch与TensorFlow Lite实战指南
  • AI编程助手插件:提升Minecraft Forge模组开发效率的实践指南