#一、定义
适配器模式(Adatper):将一个类的接口转换成客户希望的另外一个接口。Adapter模式将使得原本由于接口不兼容而不能一起工作的那些类可以一起工作就像usb转接头充当适配器,把两种不兼容的接口,通过转化可以变成一起工作。
系统的数据和行为都正确,但接口不符时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用的环境要求不一致的情况。
适配器有两种实现方式,一种是类适配器,一种是对象适配器,类适配器使用继承关系来实现,对象适配器使用组合关系来实现。
二、UML类图
这里我们实际请求的方法是Adaptee中的specificRequest方法,而我们能识别的是Target类中的request方法,这样我们通过构造一个Adapter类,通过在内部包含一个Adaptee对象,把原接口转换成目标接口,通过在request方法中通过目标对象调用specificRequest方法,完成接口之间的转化。
类适配器 基于继承实现
public interface ITarget {
void f1();
void f2();
void f3();
}
要转化的接口定义
public class Adaptee {
void a(){//todo }
void b(){//todo }
void c(){//todo }
}
public class Adapter extend Adaptee implement ITarget{
void f1(){
super.a();
}
void f2(){
super.b();
}
void f3(){
super.c();
}
}
基于组合
public class Adapter implement ITarget{
private Adaptee adaptee;
public Adaper(Adaptee adaptee){
this.adaptee=adaptee
}
void f1(){
adaptee.a();
}
void f2(){
//重新实现
}
void f3(){
adaptee.c();
}
}
#三、使用
如果使用一个已经存在的类,但如果它的接口,也就是它的方法和你要求的不同时,就可以考虑使用适配器模式。其实可以在设计初期规避这些问题,就不用使用适配器接口,只有当系统开发到一定程度不太容易修改时候再使用适配器模式。