原来做安卓项目中,遇到了各种各样的adapter,然后百度了一下adapter是适配器的意思,我们来思考一下什么是适配器。
在生活中,举一个例子,我们的笔记本电脑电源是三相的插头,但是我们只有一个二相插座的话该怎么办呢?这里就用到了适配器模式。同理,我们见什么人说什么话,翻译软件按照不同国籍翻译也是一种适配。
定义:适配器模式将一个类的接口,转换成客户期望的另一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
我们来看我们第一个例子,首先我们定义一个三相插座的接口:他有一个用三相接口充电的方法
public interface ThreePlugIf {
//使用三相电流
public void powerWithThree();
}
然后我们再定义一个二相插头:它有一个用二相接口充电的具体实现方法。
public class GBTwoPlugIf {
//使用二相电流供电
public void powerWithTwo(){
System.out.println("使用二相电流供电");
}
}
我们再定义一个笔记本电脑类,它需要用三相插头充电,所以需要在它的构造函数中传入一个三相的接口,而此时。我们只有一个二相插头,该怎么做呢?
public class NoteBook {
private ThreePlugIf plug;
public NoteBook(ThreePlugIf plug) {
this.plug=plug;
}
//使用插座充电
public void charge(){
plug.powerWithThree();
}
public static void main(String[] args) {
GBTwoPlugIf two=new GBTwoPlugIf();
ThreePlugIf three=new TwoPlugAdapter(two);
noteBook.charge();
}
}
我们定义一个三相的适配器接口,采用组合的方式来实现一个适配二相插头的方法:
/**
* 二相转三相的插座适配器
* @author lemoon
*
*/
public class TwoPlugAdapter implements ThreePlugIf {
private GBTwoPlugIf plug;
public TwoPlugAdapter(GBTwoPlugIf plug) {
this.plug = plug;
}
@Override
public void powerWithThree() {
System.out.println("通过转化");
plug.powerWithTwo();
}
}
它通过继承ThreePlugIf来实现接口,同时它含有一个二相GBTwoPlugIf的实例变量,我们在接口的实现方法中调用变量的充电方法。即可完成适配的任务。对外暴露的它仍是一个ThreePlugIf的实现类。
接下来我们将它传给笔记本电脑类
public static void main(String[] args) {
GBTwoPlugIf two=new GBTwoPlugIf();
ThreePlugIf three=new TwoPlugAdapter(two);
NoteBook noteBook=new NoteBook(three);
noteBook.charge();
}
这样我们就完成了一个二相转三相的适配任务。
同样,我们还可以通过继承的写法来实现,它同时继承了GBTwoPlugIf并实现了ThreePlugIf接口
/*
* 采用继承方式的插座适配器
*/
public class TwoPlugAdapterExtends extends GBTwoPlugIf implements ThreePlugIf {
@Override
public void powerWithThree() {
System.out.print("借助继承适配器");
this.powerWithTwo();
}
}
1.组合:采用组合方式的适配器称为对象适配器。特点:把“被适配者”作为一个对象组合到适配器中,
以修改目标接口包装被适配者。
2.继承:采用继承的方式被称为类适配器。特点:通过多重继承不兼容接口,实现对目标接口的匹配,单一的为某个类实现适配。
适配器的作用
1.透明
通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的,这样做更简单,更直接,更紧凑。
2.重用
复用了现存的类,解决了现存类和复用环境要求不一致的问题
3.低耦合
将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码(遵循开闭原则)。