适配器模式也是Java中比较常见的一种模式,我们在开发中经常遇到各个系统之间的对接问题,每个系统的数据模型大多都有差异,直接对接可能会导致不能正常工作,要是修改原先的数据模型又可能会影响之前的系统功能,这时候就需要用到适配器模式。适配器模式说白了就是一个类似于转接头的功能,能够连接两个或多个不兼容的接口可以一起正常工作,又不影响连接的接口的原先功能。
Source————待适配的类,需要能让该类能接入其他原先不兼容的接口
Target————目标接口
Adapter————适配器,将Source的功能扩展到Target中,实现接口的兼容
就以手机的数据插头为例子,之前的手机数据头大多都是Mini USB类型的,然而这次加入了type-c,需要用到适配器模式来对该Source类进行适配,适配后的类能兼容多种类型
//需要适配的类
public class Source{
public String usb(){
return "Mini USB";
}
}
//目标接口,新增能支持typeC
interface Target{
public String typeC();
}
适配器有三种模式可以实现:类似配器、对象适配器、接口适配器
类适配器:类适配器主要是通过继承待适配类Source的方式实现兼容
对象适配器:对象适配器跟类适配器结构差不多,就是写法上的不同,不是通过继承Source类而是要传入待适配类Source的对象来实现兼容
接口适配器:接口适配器在不希望实现一个接口中给所有方法的时候会用到,可以用抽象类实现所有方法,在使用时继承该抽象类按照需求实现对应方法即可。
类适配器模式——ClassAdapter
public class ClassAdapter extends Source implements Target{
@Override
public String typeC() {
String type = usb();
System.out.println("经过部分处理步骤,将原先的Mini USB接口转换成type-c返回");
return "type-c";
}
}
public class AdapterTestClass {
public static void main(String[] args) {
Target t = new ClassAdapter();
System.out.println(t.typeC());
}
}
对象适配器模式——ObjectAdapter
public class ObjectAdapter implements Target {
private Source source;
ObjectAdapter(Source source){
this.source = source;
}
@Override
public String typeC() {
String type = this.source.usb();
System.out.println("经过部分处理步骤,将原先的Mini USB接口转换成type-c返回");
return "type-c";
}
}
public class AdapterTestObject {
public static void main(String[] args) {
Source source = new Source();
Target t = new ObjectAdapter(source);
System.out.println(t.typeC());
}
}
接口适配器模式
接口适配器跟上面的两种结构上还是有点区别的,主要又进行了一层抽象化
//公共类型接口
public interface Sourceable{
public String usb(); //usb类型
public String typeC(); //type-c类型
}
//定义了Sourceable的抽象实现类,对Sourceable进行重写,但不做具体实现
public abstract class AbstractAdapter implements Sourceable {
@Override
public void usb() {
}
@Override
public void typeC() {
}
}
//这个类专门给type-c做适配
public class TypeCSource extends AbstractAdapter{
@Override
public void typeC() {
System.out.println("这个支持type-c。。。");
}
}
//这个类专门给Mini USB做适配
public class USBSource extends AbstractAdapter{
@Override
public void usb() {
System.out.println("这个支持Mini USB。。。");
}
}
public class AdapterTestObject {
public static void main(String[] args) {
Sourceable typeCSource = new TypeCSource();
Sourceable usbSource = new USBSource();
typeCSource.typeC();
usbSource.usb();
}
}