public interface Usb {
/**
* 提供Usb 功能
*/
void providerUsbSomething();
}
// usb 设备的 具体实现类,提供usb 功能
public class UsbPhone implements Usb {
@Override
public void providerUsbSomething() {
System.out.println("提供 usb 手机的 功能");
}
}
public class Computer {
/**
* 电脑 默认可以接入 Usb功能
* @param usb
*/
void input(Usb usb) {
usb.providerUsbSomething();
}
}
现在我们有一个Typec的设备,则无法直接接入到电脑上使用
public interface TypeC {
/**
* 提供Typec 功能
*/
void providerTypecSomething();
}
// 已存在的、具有特殊功能、但不符合我们既有的标准接口的类
// 这个类 也可以是一开始就没有接口,只有一个类
public class TypeCPhone implements TypeC {
@Override
public void providerTypecSomething() {
System.out.println("提供Typec 功能的手机");
}
}
我们则需要一个类适配器,来转换成Usb的接口实现类,传递给电脑使用
适配器类 可以继承要被适配的类,并且实现使用方需要的的接口
此例中,adapater类可 继承 Typec的具体实现类,并实现Usb接口
// 电脑需要Usb,适配器 继承 TypeCPhone 实现 Usb 功能
// 内部再调用 Typec提供的功能
public class USBAdapter extends TypeCPhone implements Usb {
@Override
public void providerUsbSomething() {
this.providerTypecSomething();
}
}
适配器包含三种角色
Target(目标接口):客户端所需要的接口,可以是接口或抽象类,也可以是实体类。(Usb)
Adaptee(需要适配的类):被适配者。 (TypeC的类)
Adapter(适配器):把原接口转化成目标接口的类。
对象适配器 (组合)
类适配器 需要继承 自被适配的类,产生了耦合度较高的问题,由此,我们常用的适配器模式是对象适配器。
基本思路和类的适配器模式相同,只是将 Adapter 类做修改。
不是继承 TypecPhone 类,而是持有 TypecPhone 类的实例,以解决兼容性的问题。
public class USBAdapter implements Usb {
// 原来 需要被适配的对象
private TypeC typeC;
@Override
public void providerUsbSomething() {
typeC.providerTypecSomething();
}
}