
目录一.意图二.结构三.举例手机充电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)正确答案将我们上述的答案和下面进行对比发现全对了。