有些时候, 我们要使用到的功能, 在其他的模块中已经完成了。 但是当我们直接使用这个已经实现的功能模块的时候, 已经实现的这个模块和我们现在需要使用到的模块之间有接口不兼容的问题。 此时, 我们没有办法直接使用这个已经实现的模块。
电源适配器: 每一个手机、 电脑都有电源适配器, 可以将220V的交流电适配成电脑、 手机可以承受的范围, 可以直接使用的范围。
手机适配器: 电脑上都有USB接口, 可以直接连接一些USB的外设设备, 例如: U盘、 鼠标、 键盘、 硬盘…。 但是, 有些时候,
我们需要将手机连接到电脑上。 此时, 手机是不能直接连接到电脑上的, 因为手机和电脑直接是接口不兼容的。 Lighting
适配器模式,将一个类的接口转换成客户希望的另外一个接口。 适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
实现方式将自己的接口包裹在一个已经存在的类中。
public class Program {
public static void main(String[] args) {
// 设计电脑
Computer computer = new Computer();
// 实例化外设设备
Mouse mouse = new Mouse();
Phone phone = new Phone();
// 连接设备
computer.setUsb1(mouse); // 鼠标是USB设备,可以直接连接到电脑上
computer.setUsb2(new Adapter(phone)); // 手机是Lighting设备,需要由适配器完成辅助连接
// 展示设备的信息
computer.showDeviceInfo();
}
}
public interface USB {
// 获取一个USB设备的描述信息,汇报给电脑
String getUSBDeviceInfo();
}
//电脑有两个USB接口
public class Computer {
private USB usb1;
private USB usb2;
public void setUsb1(USB usb1) {
this.usb1 = usb1;
}
public void setUsb2(USB usb2) {
this.usb2 = usb2;
}
/**
* 展示自己连接的各种外设设备的信息
*/
public void showDeviceInfo() {
System.out.println("USB1端口连接了: " + this.usb1.getUSBDeviceInfo());
System.out.println("USB2端口连接了: " + this.usb2.getUSBDeviceInfo());
}
}
/** @Description 实现了 USB-Lighting 的转换
*/
public class Adapter implements USB {
// 需要在这个类的内部维护一个Lighting接口的引用
// 维护一个需要进行接口转换的对象
private Lighting lightingDevice;
// 实例化适配器对象的时候,已经完成了内部的属性的赋值
public Adapter(Lighting lightingDevice) {
this.lightingDevice = lightingDevice;
}
// 这个方法,是USB接口中的方法,目的是需要向电脑汇报自己的设备信息
// 但是此时,需要汇报给电脑的并不是这个适配器的信息,而是这个适配器连接的Lighting设备的信息
// 适配器只是一个中间件,完成了由Lighting到USB的接口转换
@Override
public String getUSBDeviceInfo() {
// 询问Lighting设备的信息,并且将结果直接汇报给电脑即可
return this.lightingDevice.getLightingDeviceInfo();
}
}
/** @Description 鼠标类,是一个USB接口的实现类,可以直接通过USB接口连接到电脑上
*/
public class Mouse implements USB {
@Override
public String getUSBDeviceInfo() {
return "鼠标";
}
}
/** @Description 手机支持的接口,与USB不同
*/
public interface Lighting {
// 获取一个设备的信息,汇报给适配器
String getLightingDeviceInfo();
}
/** @Description 手机,是一个Lighting接口的实现类
*/
public class Phone implements Lighting {
@Override
public String getLightingDeviceInfo() {
return "iPhone 12 Pro Max";
}
}