适配器模式:一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
适配器模式有类的适配器模式和对象的适配器模式两种不同的形式。
类适配器模式:
类的适配器模式把适配的类的API转换成为目标类的API
目标(Target)角色:这就是所期待得到的接口。
源(Adapee)角色:现在需要适配的接口。
适配器(Adaper)角色:适配器类是本模式的核心。适配器把源接口转换成目标接口。
public interface Target { ----目标
// 这是源类Adaptee也有的方法
public void sampleOperation1();
//这是源类Adapteee没有的方法
public void sampleOperation2();
}
public class Adaptee { -----源
public void sampleOperation1(){}
}
public class Adapter extends Adaptee implements Target {
//适配器角色Adapter扩展了Adaptee,同时又实现了目标(Target)接口
/** * 由于源类Adaptee没有方法sampleOperation2() * 因此适配器补充上这个方法 */ @Override public void sampleOperation2() { //写相关的代码 } sampleOperation1()方法因为继承也是可以被使用}
对象适配器模式
与类的适配器模式一样,对象的适配器模式把被适配的类的API转换成为目标类的API,与类的适配器模式不同的是,对象的适配器模式不是使用继承关系连接到Adaptee类,而是使用委派关系连接到Adaptee类。
源代码:
public class Adapter {
private Adaptee adaptee;
public Adapter(Adaptee adaptee){
this.adaptee = adaptee;
}
/**
* 源类Adaptee有方法sampleOperation1
* 因此适配器类直接委派即可
*/
public void sampleOperation1(){
this.adaptee.sampleOperation1();
}
/**
* 源类Adaptee没有方法sampleOperation2
* 因此由适配器类需要补充此方法
*/
public void sampleOperation2(){
//写相关的代码
}
}
类适配器和对象适配器的权衡类适配器使用对象继承的方式,是静态的定义方式;而对象适配器使用对象组合的方式,是动态组合的方式。
建议尽量使用对象适配器的实现方式,多用合成/聚合、少用继承。当然,具体问题具体分析,根据需要来选用实现方式,最适合的才是最好的。
适配器模式的优点:
1.更好的复用性
2.更好的扩展性
缺点:过多的使用适配器,会让系统非常零乱,不易整体进行把握,如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。