适配器模式分为三种:类的适配器、对象的适配器、接口的适配器。
简单的理解适配,就是把两个不相匹配的东西变的匹配。下面以手机使用普通u盘为例,一般情况下,手机需要使用u盘时,由于接口的不吻合,需要使用到OTG线进行接口转换。
1、类的适配器
usb接口
public interface Usb {
void usbPort();
}
OTG类
public class OTG {
public void OtgLine(){
System.out.println("已连接上OTG线,可接U盘");
}
}
适配器类(Adapter)
public class Adapter extends OTG implements Usb {
@Override
public void usbPort() {
OtgLine(); //连接OTG,转换接口
}
}
测试类
public class AdapterTest {
public static void main(String args[]){
Usb mUsb = new Adapter();
mUsb.usbPort();
}
}
输出:
2、对象的适配器 ,在上面的代码中,仅修改Adapter类即可,如下:
public class Adapter implements Usb {
private OTG mOTG;
public Adapter(OTG otg){
this.mOTG = otg;
}
@Override
public void usbPort() {
mOTG.OtgLine();
}
}
//测试代码为
public class AdapterTest {
public static void main(String args[]){
OTG otg = new OTG();
Usb mUsb = new Adapter(otg);
mUsb.usbPort();
}
}
3、接口的适配器,通过定义一个抽象类实现接口的空方法。然后定义一个具体类继承该抽象类,重写自己需要使用的方法。比如,假设一台手机有三个接口,分别是usb,耳机和电源,在某一时刻,只想听歌,那么可以这样写:
手机接口类(IPhone)
public interface IPhone {
void usb();
void audio();
void power();
}
实现了IPhone的抽象类Phone
public abstract class Phone implements IPhone {
@Override
public void usb() { }
@Override
public void audio() { }
@Override
public void power() { }
}
具体类 User
public class User extends Phone {
@Override
public void audio() {
super.audio();
System.out.println("只想听歌");
}
}
应用场景:当系统需要使用现有类,但是类的接口不符合系统的需要时,可以通过适配器模式进行接口的转换。优点:在于更好的复用性和扩展性,但是,不管使用什么东西,讲究的是一个合理性。因此,过多的使用适配器模式,会让自己的代码变得不好掌控。