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

📅 2026/7/14 23:58:06 👁️ 阅读次数 📝 编程学习
什么是适配器模式?一文详解

目录

一.意图

二.结构

三.举例:手机充电

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)

正确答案

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