适配器模式
对于适配器模式,主要有两种实现方式:类适配器和对象适配器。适配器设计模式的一个重要的用途就是解决代码的不兼容问题。
类适配器和对象适配器
适配器模式,顾名思义,这个模式是用来做适配的,它将不兼容的接口转化为兼容的接口,让原本不能一起工作的类可以一起工作。
适配器有两种实现方式,其中的类适配器使用继承关系来实现,对象适配器使用组合关系来实现。具体的代码实现如下所示。其中,ITarget表示要转化成的目标接口,Adaptee是一组不兼容ITarget的原始接口,Adaptor类将Adaptee转化成兼容ITarget接口定义的接口。这里提到的接口,并非编程语言的接口,而是表示宽泛的API。
//类适配器:基于继承
public interface ITarget{
void f1();
void f2();
void fc();
}
public class Adaptee{
public void fa(){.....}
public void fb(){.....}
public void fc(){.....}
}
public class Adaptor extends Adaptee implements ITarget{
@Override
public void f1(){
super.fa();
}
@Override
public void f2(){
super.fb();
}
//fc()不需要实现,直接从Adaptee中继承,这是与对象适配器最大的不同点;
}
//对象适配器:基于组合
public interface ITarget{
void f1();
void f2();
void fc();
}
public class Adaptee{
public void fa(){.....}
public void fb(){.....}
public void fc(){.....}
}
public class Adaptor implements ITarget{
private Adaptee adaptee;
public Adaptor(Adaptee adaptee){
this.adaptee = adaptee;
}
@Override
public void f1(){
adaptee.fa();
}
@Override
public void f2(){
adaptee.fb();
}
@Override
public void fc(){
adaptee.fc();
}
}
在实际的开发中,到底是选用类适配器还是对象适配器,判断的依据主要有两个,一个是Adaptee接口的个数,另一个是Adaptee接口和ITarget接口的契合程度。具体的判断规则如下:
-
如果Adaptee接口不多,那么两种方式就都可以。
-
如果Adaptee的接口很多,并且Adaptee和ITarget接口定义大部分都相同,那么推介使用类适配器。因为大部分的接口相似,这样的话实现的代码量会小一点。
-
如果Adaptee的接口很多,并且Adaptee和ITarget接口定义大部分都不相同,那么推介使用对象适配器。因为组合结构相对于继承结构更加灵活。
适配器模式的几种应用场景
-
封装有缺陷的接口设计
-
统一多个类的接口设计
-
替换依赖的外部系统
-
兼容老版本接口
-
适配不同格式的数据