- 将一个类的接口转换成客户希望的另外一个接口。适配器模式(Adapter)使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
- GOF将适配器模式分为类适配器模式和对象适配器模式。区别仅在于适配器角色对于被适配角色的适配是通过继承完成的还是通过组合来完成的。GOF提倡使用组合来代替继承。
(一)适配器模式的组成结构
1) 目标(Target)角色:定义 Client 使用的接口。
2) 被适配(Adaptee)角色:这个角色有一个已存在并使用了的接口,而这个接口是需要我们适配的。
3) 适配器(Adapter)角色:这个适配器模式的核心。它将被适配角色已有的接口转换为目标角色希望的接口。
适配器模式实现的一种情况的简单类图:
(二)适配器模式的示例代码
目标角色 – Target
public interface Target {
/**
* 这是源类Adaptee也有的方法
*/
public void sampleOperationA();
/**
* 这是源类Adapteee没有的方法
*/
public void sampleOperationB();
}
被适配角色 – Adaptee
public class Adaptee {
public void sampleOperationA(){}
}
适配器角色 – Adapter
使得Adaptee能够适配目标接口Target
public class Adapter {
private Adaptee adaptee;
public Adapter(Adaptee adaptee){
this.adaptee = adaptee;
}
/**
* 源类Adaptee有方法sampleOperationA
* 因此适配器类直接委派即可
*/
public void sampleOperationA(){
this.adaptee.sampleOperationA();
}
/**
* 源类Adaptee没有方法sampleOperationB
* 因此由适配器类需要补充此方法
*/
public void sampleOperationB(){
doSomethingElse();
}
}
(三)适配器模式的优缺点
优点:
1)通过增加适配器类将适配者与目标接口联系起来,无需修改原有实现;
2)提高复用性,适配器类可以在多个系统使用;
缺点:
过多的使用适配器,会让系统非常零乱,对于项目接手,容易造成理解困难。只有在接口难以适配的情况才考虑使用适配器模式。增加接口适配比修改接口适配更优先考虑。