一、意图:ide
将一个类的接口转换成客户但愿的另一个接口。Adapter模式使得本来因为接口不兼容而不能一块儿工做的那些类能够一块儿工做。测试
二、场景描述:spa
手机的Usb数据线能够被看作适配器,不一样类型的手机经过不一样的Usb数据线链接到电脑相同的usb接口上。几年前的非智能手机,数据线链接手机的一端因为手机品牌的不一样使用了各式各样的接口,可是链接电脑的一端却采用了相同usb接口。针对特定品牌的数据线使得每种不一样的手机均可以链接到电脑的usb接口上,使得手机接口能够与电脑的usb接口协同工做。code
另外,C++中的栈(stack)、队列(queue)被称做容器适配器,它们自己都是基于线性表来实现的,可是对外提供了特定的操做接口,如stack的LIFO(last-in first-out)特性。对象
三、适配器模式类图:blog
对象适配器类图:继承
角色:接口
协做:队列
注:get
四、适用性:
五、实例类图:
说明:
六、代码实例:
手机端口类,含有手机端口的信息,对应适配器模式中的Adaptee。
1 package com.crazysnail.adapter; 2 3 public class PhonePort { 4 public void getPhonePort(){ 5 System.out.println("我是一个手机接口"); 6 } 7 }
Usb端口类,知足将设备链接到电脑的新需求,对应适配器模式中的Target。
1 package com.crazysnail.adapter; 2 3 public class UsbPort { 4 public void getUsbPort(){ 5 System.out.println("我是一个usb接口"); 6 } 7 }
数据线类,一端链接到手机端口,开放数据线另外一端的usb接口,对应适配器模式中的Adapter。
1 package com.crazysnail.adapter; 2 3 public class UsbDataLine extends UsbPort{ 4 private PhonePort phonePort; 5 6 public UsbDataLine() { 7 System.out.println("获取一条匹配特性型号手机的数据线"); 8 phonePort = new PhonePort(); 9 } 10 11 @Override 12 public void getUsbPort(){ 13 phonePort.getPhonePort(); 14 System.out.println("手机接口链接到数据线一端,开放数据线的usb接口一端"); 15 } 16 }
人类类,有链接手机到电脑的需求,使用数据线将手机链接到电脑,对应适配器模式中的Client。
1 package com.crazysnail.adapter; 2 3 public class Human { 4 public static void linkPhoneToComputer(UsbDataLine line){ 5 line.getUsbPort(); 6 System.out.println("将Usb接口链接到电脑"); 7 } 8 }
测试类,效果演示。
1 package com.crazysnail.adapter; 2 3 public class AdapterTest { 4 public static void main(String[] args){ 5 UsbDataLine newUsbDataLine = new UsbDataLine(); 6 7 Human.linkPhoneToComputer(newUsbDataLine); 8 } 9 }
效果图:
七、适配器模式的特色