定义
将一个借口转换成客户希望的另一个接口
角色
Target(目标抽象类)
定义客户所需接口,通常为一个抽象类或接口
public interface TargetInterface {
int getMiddleFun(int[] array);
}
Adaptee(适配者类)
定义了一个已经存在的接口,这个接口需要适配。(通常没有其源码)
public class AdapateeA {
public int getMiddle(int[] array) {
return array[array.length / 2];
}
}
Adapter(适配器类)
通过继承Target并关联一个Adaptee对象使二者产生联系
public class Adapter implements TargetInterface {
private AdapateeA adapateeA;
public Adapter() {
adapateeA = new AdapateeA();
}
@Override
public int getMiddleFun(int[] array) {
return adapateeA.getMiddle(array);
}
}
客户类
public class AdapterClient {
public static void main(String[] args) {
int[] array = {1, 2, 3, 4, 5, 6, 7};
Adapter adapter = new Adapter();
System.out.println(adapter.getMiddleFun(array));
}
}
测试结果:
4
类适配器
类适配器模式和对象适配器模式最大的区别在于适配器和适配者之间的关系不同,对象适配器模式中适配器和适配者之间是关联关系,而类适配器模式中适配器和适配者是继承关系
由于Java、C#等语言不支持多重类继承,因此类适配器的使用受到很多限制,例如如果目标抽象类Target不是接口,而是一个类,就无法使用类适配器。
缺省适配器
当不需要实现一个接口所提供的所有方法时,可先设计一个抽象类实现该接口,并为接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可以选择性地覆盖父类的某些方法来实现需求,它适用于不想用一个接口中的所有方法的情况,又称为单接口适配器模式。
优点
(1)将目标类和适配者类解耦
(2)提高适配者的复用性
(3)极好的灵活性和拓展性
缺点
(1)多于多个适配者的适配,对不支持多继承的语言不友好
(2)适配者不能为最终类
适用场景
(1)没有现有类的源码
(2)需要中间类将类之间关联起来的场景。