适配器模式把适配的API转换成为目标类的API。
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
在上图中,目标(Target)角色:这就是所期待得到的接口。源(Adapee)角色:现在需要适配的接口。适配器(Adaper)角色:适配器类是本模式的核心。适配器把源接口转换成目标接口。显然,这一角色不可以是接口,而必须是具体类。
用代码写就是这样:
interface Adaptee {
void sampleOperation1();
}
abstract class Adapter implements Adaptee {
@Override
public void sampleOperation1() {
}
void sampleOperation2() {
};
}
class Target extends Adapter {
@Override
public void sampleOperation1() {
super.sampleOperation1();
}
@Override
void sampleOperation2() {
super.sampleOperation2();
}
}
可以想象成这样,某天你去国外旅游,遇到一个110V的接口,这个110V的接口就是Adaptee,然后你用一个110V-220V的转接器插上去,这个110V-220V的转接器就是Adapter,之后这个110V-220V的转接器提供的接口就是Target。也就是你需要的东西。把不适合你的接口换成适合你的接口。
同时,其实Adapter“适配器”,直接就是“改编者”的意思。
这下大概明白了吧,然而,适配器如果这样用,在编程里面实在是太无厘头了,为何要无故多定义一个类呢?还不如直接改写接口的方法,或者再弄一个新的接口!
其主要还是将两个不相关的接口、抽象类连接起来,将2个类里面我们需要的东西,凑起来,再组成一个我们所需要的新类。
下面再用一个例子来说明。如下代码,interface1接口要求实现三个抽象方法,而Class1里面抽象则有一个name是我们需要的。很明显,我们需要Class1的变量,interface1里面的方法,因此,我们定义一个新的适配器类HelloAdapter将Class1与interface1连接起来。在主函数中,HelloAdapter的实例想用哪个方法就用哪个方法。
而关键是,接下去,HelloAdapter的子类,还无须强制实现interface1接口的3个方法,HelloAdapter的子类想要interface1与Class1的东西,都可以随便拿。
interface interface1{//提供三个抽象方法
public void Chinese();
public void English();
public void Japanese();
}
abstract class Class1{//提供name这个变量
private String name;
public Class1(String name) {
super();
this.setName(name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class HelloAdapter extends Class1 implements interface1{
public HelloAdapter(String name){
super(name);
}
@Override
public void Chinese() {
System.out.println(getName()+",你好!");
}
@Override
public void English() {
System.out.println("Hello,"+getName()+"!");
}
@Override
public void Japanese() {
System.out.println(getName()+"、こんにちは。");
}
}
public class AdapterTest {
public static void main(String[] args) {
HelloAdapter helloAdapter1=new HelloAdapter("Tom");
helloAdapter1.English();
HelloAdapter helloAdapter2=new HelloAdapter("小明");
helloAdapter2.Chinese();
HelloAdapter helloAdapter3=new HelloAdapter("太郎");
helloAdapter3.Japanese();
}
}
运行结果如下所示:
这就是我个人理解的适配器模式,在C#的ASP.NET的数据库结果打印类、安卓中存在大量的适配器,它就是将两样本来毫不相干的数据源和UI组件,连接起来的桥梁。比如安卓中,BaseAdapter就是图片数组与网格视图GridView的连接的桥梁。
再理解不了,Adapter翻译为……与……的桥梁得了。