适配器模式
1.定义
适配器(Adapter) 模式标准定义:将一个类的接口转换成客户希望的另外一个接口.
2.实现
适配器模式:
- 目标(Target)角色: 定义了客户所期望的操作.目标角色可以是具体类或抽象类.该角色不可缺少.
- 源(Adaptee)角色: 这是我们原有的产品,也是需要被适配的产品.
- 适配器(Adapter)角色: Adapter对Adaptee接口与Target接口进行适配,适配器把源接口转换成目标接口,在Target目标角色与Adaptee源角色之间提供一种过渡,即把Adaptee源角色所提供的接口转换为Target目标角色所提供的接口.
2.1 对象适配器和类适配器
对象适配器的实现 依赖于对象组合.就如同前面的实现示例,都是采用的对象组合的方式.也就是前面讲述的都是对象适配器实现的方式.
类适配器的实现
采用多重继承对一个接口与另一个接口进行匹配.由于java不支持多重继承,所以可以实现Target接口并继承Adaptee类或者反之也行.

2.2 示例
public class Source {
public void method1() {
System.out.println("this is original method!");
}
}
public interface Targetable {
/* 与原类中的方法相同 */
public void method1();
/* 新类的方法 */
public void method2();
}
public class Adapter extends Source implements Targetable {
@Override
public void method2() {
System.out.println("this is the targetable method!");
}
}
public class AdapterTest {
public static void main(String[] args) {
Targetable target = new Adapter();
target.method1();
target.method2();
}
}
3.总结
类适配器和对象适配器的权衡取舍
- 实现上
- 类适配器使用对象继承的方式,是静态的定义方式
- 对象适配器使用对象组合的方式,是动态组合的方式.
- 继承
- 对于类适配器:由于适配器直接继承了Adaptee,使得适配器不能和Adaptee的子类一起工作,因为继承是一个静态的关系,当适配器继承了Adaptee过后,就不可能再去处理Adaptee的子类了.
- 对于对象适配器:允许一个Adaptee和多个Adaptee,包括Adapter和它所有的子类一起工作.因为对象适配器采用的是对象组合的关系,只要对象类型正确,是不是子类都无所谓.
- 适配器
- 对于类适配器:适配器可以重定义Adaptee的部分行为,相当于子类覆盖父类的部分实现方法.
- 对于对象适配器:要重定义Adaptee的行为比较困难,这种情况下,需要定义Adaptee的子类来实现重定义,然后让适配器组合子类.
- Adaptee
- 对于类适配器:仅仅引入了一个对象,并不需要额外的引用来间接得到Adaptee.
- 对于对象适配器:需要额外的引用来间接得到Adaptee
适配器模式的优缺点
- 更好的复用性
- 更好的可扩展性
- 过多的使用适配器,会让系统非常凌乱,不容易整体进行把握.(最好在后期的系统维护中才使用)
何时选用适配器模式
- 如果你想要使用一个已经存在的类,但是它的接口不符合你的需求,你已经没有办法再去改这个接口,这种情况可以使用适配器模式,来把已有的实现转换成你需要的接口
- 如果你想要创建一个可以复用的类,这个类可能和一些不兼容的类一起工作,这种情况可以使用适配器模式,到时候需要什么就适配什么.
- 如果你想使用一些已经存在的子类,但是不可能对每一个子类都进行适配,这种情况可以选用对象适配器,直接适配这些子类的父类就可以了.