适配器模式

介绍

使用频率很高,通过在Android中随处可见的Adapter就可以看得出。适配器是将两个不兼容的类融合在一起。例如,经常碰到要在两个没有任何关系的类型之间进行交互,第一个解决办法是修改各自的类的接口,但是如果我们没有源码或者不愿意为了一个应用修改我们的接口,这时候我们往往会使用一个Adapter,在这两种借口之间创建一个混血儿接口,这个Adapter会将两种接口进行兼容,在不修改原有代码的情况下满足需求。

适配器模式把一个接口变成客户端所期待的另一个接口,从而使原本因接口不匹配而无法工作在一起的两个类能够在一起工作。

使用场景

接口不兼容的情况,系统需要使用现有的类,而类的接口不符合系统的需要。

简单实现

用电源接口做例子,笔记本电脑一般需要5V的电压,而我们电线的电压一般是220V。这个时候出现了不匹配的情况,在软件开发中我们称之为接口不兼容,此时就需要一个适配器来进行接口的转换。在软件开发过程中有这么一句话,任何问题都可以通过加一个中间层来解决,这里的Adapter就可以理解为中间层。

Target接口 5v电压
Adaptee接口 220V电压
Adapter将电压从220V转到5V

类适配器模式

1
2
3
4
//Target角色
public interface FiveVolt {
public int getVolt5();
}
1
2
3
4
5
6
7
8
//Adaptee角色
public class Volt220 {

public int getVolt220(){
return 220;
}

}
1
2
3
4
5
6
7
//Adapter角色,将220V电压转换成5V电压。
public class VoltAdapter extends Volt220 implements FiveVolt {
@Override
public int getVolt5() {
return 5;
}
}

Target角色给出了需要的目标接口,而Adaptee则是需要转换的对象。Adapter类则是将Volt220转换成Target接口。对应的Target目标是要获取5V的电压,而Adaptee正常输出220V电压,这时候就需要电源适配器将220V电压转换成5V电压,解决接口不兼容的问题。

1
2
VoltAdapter voltAdapter = new VoltAdapter();
System.out.println(voltAdapter.getVolt5());

对象适配器模式

1
2
3
4
//Target角色
public interface FiveVolt {
public int getVolt5();
}
1
2
3
4
5
6
7
8
//Adaptee角色
public class Volt220 {

public int getVolt220(){
return 220;
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class VoltAdapter  implements FiveVolt {

Volt220 volt220 ;

public VoltAdapter(Volt220 volt220){
this.volt220=volt220;
}

@Override
public int getVolt5() {
return 5;
}

public int getVolt220(){
return volt220.getVolt220();
}

}
1
2
VoltAdapter voltAdapter = new VoltAdapter(new Volt220());
System.out.println(voltAdapter.getVolt5());

在实际的开发中,Adapter还有一种应用的场景,就是输入有无数种情况,但是输出类型是同一的,我们可以通过Adapter返回一个统一的输出,而具体的输入则留给用户去处理,内部只需要知道输出是否符合要求的类型即可。例如ListView的Adapter,用户Item View各式各样,但最终都是属于View类型,ListView只需要知道getVIew返回的是一个View即可,具体是什么View类型并不需要ListView关心。而在食用Adapter模式的过程中,建议尽量使用对象适配器的方式,多用合成或者聚合,少用继承,当然,具体问题,具体分析,根据需求来选用实现方式,最合适的才是最好的。

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器