news 2026/5/22 8:07:06

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
什么是适配器模式?一文详解

目录

一.意图

二.结构

三.举例:手机充电

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)

正确答案

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

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

如何快速实现百度网盘高速下载:完整解析方案与实战指南

如何快速实现百度网盘高速下载:完整解析方案与实战指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 百度网盘直链解析工具 baidu-wangpan-parse 是一款开源解决…

作者头像 李华
网站建设 2026/5/17 7:44:56

PDF字体修复工具

链接:https://pan.quark.cn/s/a96c35aa2986PDF Font Fixer是一个专业的 PDF 内嵌字体的 Unicode 映射修复工具。使用方法: 1、文件菜单打开PDF。或者直接拖拽文档到软件窗口。 2、点击字体名称,查看字体属性,是否嵌入。本软件只处…

作者头像 李华
网站建设 2026/5/17 7:42:25

Arm Iris仿真框架:参数化设计与验证实践

1. Arm Iris组件化仿真框架概述在SoC设计与验证领域,Arm Iris作为核心仿真框架,为工程师提供了高度参数化的组件建模能力。不同于传统RTL仿真,Iris采用事务级建模(TLM)方法,通过配置驱动的方式实现硬件行为…

作者头像 李华
网站建设 2026/5/17 7:42:24

全桥开关电源实验板深度解析:从硬件架构到波形测量与故障排查

1. 从零开始理解全桥拓扑:不只是四个开关管那么简单如果你刚开始接触开关电源,听到“全桥”这个词,脑海里可能立刻浮现出四个开关管组成的H桥结构图。没错,这是它的核心骨架,但一个能稳定、高效工作的全桥变换器&#…

作者头像 李华
网站建设 2026/5/17 7:40:20

AI安全攻防:从提示词越狱到模型对齐的对抗实践

1. 项目概述:当AI助手“越狱”成为可能最近在AI安全研究圈里,一个名为“ZORG-Jailbreak-Prompt-Text”的项目引起了我的注意。这个项目本质上是一个精心设计的“越狱”提示词集合,旨在探索大型语言模型(LLM)的安全边界…

作者头像 李华
网站建设 2026/5/17 7:35:31

合宙Air153C看门狗芯片:嵌入式系统可靠性的硬件守护方案

1. 项目概述:一颗“小而美”的国产看门狗芯片最近在做一个低功耗的户外监测设备项目,主控用的就是合宙的Air系列MCU。在调试过程中,最让我头疼的就是系统偶尔的“死机”问题。设备部署在野外,不可能每次都跑过去手动重启。正当我琢…

作者头像 李华