适配器模式定义
举一个例子简单的理解:当我们的电脑外接一个vga接口的显示屏时,如果我们的电脑本身没有vga接口,只有hdmi,这时候就需要使用一个转接口将vga转成hdmi接口,从而让电脑连接。这里的转接口就是一个适配器,解决的办法就是一种适配器模式
在程序开发中,当一个系统需要使用另一个系统提供的外部接口,而这个外部接口与目前系统使用的不兼容时,就需要使用适配器模式。
适配器模式就是将一个系统的接口转换成另外一种形式,从而使原来不能直接使用的接口变得可以使用
适配器的使用场景
系统需要使用其他系统提供的外部接口,但是该接口不能直接使用时,可以定义一个适配器用来将该接口转换成本系统可用接口
假设定义了一个接口,接口中有很多方法,然而我们现在定义的类只需要使用其中的一个方法,如果直接实现该接口,就必须重写其他没必要用的接口方法,所以这里可以定义一个抽象类或者一个普通的类用于实现该接口并且为该接口中定义的所有方法提供空实现,后续定义的类只需要继承该抽象类从而自定义想要重写的方法即可。这里的抽象类就是一个适配器
适配器组成
适配器模式主要由三个部分组成:目标类、源类和适配器类,分别对应于前面例子的本地系统、外部系统以及适配器
适配器实现实例
定义一个java接口,里面有8个抽象方法:
public interface Target{
void method1();
void method2();
void method3();
void method4();
void method5();
void method6();
void method7();
void method8();
}
定义一个适配器:
public abstract class Adapter implements Target{
}
模拟系统使用外部接口测试:
public class Sys extends Adapter{
void method1(){
}
void method4(){
}
}
还有一种使用场景,加入定义了一个方法,返回的是Map类型的值,而现在系统需要使用该方法返回List类型的值,用于调用size和get方法获取对应的信息,这时候就需要定义一个适配器用于Map和List之间的转换,适配器类如下:
public class Adapter extends ArrayList<Object>{
private Map<?,?> map;
public Adapter(Map<?,?> map){
this.map = map;
}
@Override
public int size(){
return map.size();
}
@Override
public Object get(int index){
return map.get(index);
}
}
然后我们在客户端以list形式调用size和get即可
public class Client{
public static void main(String[] args){
Adapter ada = new Adapter();
for(int i=0; i<ada.size(); i++){
System.out.println(ada.get(i));
}
}
}