什么是适配器模式?
两个不兼容的接口之间的桥梁,双方无法直接调用的时候,第三方提供适配能力。
两个对象因接口不兼容而不能在一起工作的实例,这时需要第三者进行适配。
将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
例如,讲中文的人同讲英文的人对话时需要一个翻译,用直流电的笔记本电脑接交流电源时需要一个电源适配器,用计算机访问照相机的 SD 内存卡时需要一个读卡器等。
适用场景
双方直接配合无法进行时,使用适配器模式,对其中一方进行适配。
一方适配另一方的接口
代码实现
案例:VGA转USB适配器
某苹果电脑只有USB接口,现在有个显示器需要VGA接口,提供扩展坞,USB适配VGA接口
/**
* USB
*/
interface USB {
void usb();
}
/**
* USB具体实现
*/
class USBImpl implements USB {
@Override
public void usb() {
System.out.println("USB协议");
}
}
/**
* 苹果电脑只有USB接口
*/
class Mac {
/**
* 播放
*/
public void play(USB usb) {
usb.usb();
}
}
//现在有VGA,需要适配器
/**
* VGA
*/
interface VGA {
void vga();
}
/**
* VGA具体实现
*/
class VGAImpl implements VGA {
@Override
public void vga() {
System.out.println("VGA协议");
}
}
//方式一:使用继承
/**
* VGA转USB适配器
*/
class VGA2USBAdapter extends VGAImpl implements USB {
@Override
public void usb() {
super.vga();
}
}
//方式二:使用组合
/**
* VGA转USB适配器
*/
class VGA2USBAdapter2 implements USB {
private final VGA vga = new VGAImpl();
@Override
public void usb() {
vga.vga();
}
}
/**
* 适配器模式测试
*/
public class AdapterPattern {
public static void main(String[] args) {
//Mac电脑插入USB
Mac mac = new Mac();
USB usb = new USBImpl();
mac.play(usb);
//插入适配器VGA转USB
USB vga2USBAdapter = new VGA2USBAdapter();
mac.play(vga2USBAdapter);
}
}