一、定义
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
类图如下:
从网上找到的图片,形象的表达了适配器的定义。
源(Adaptee):需要被适配的对象或类型,相当于二座插头。
适配器(Adapter):连接目标和源的中间对象,相当于交流电适配器。
目标(Target):期待得到的目标接口,相当于插座。
二、分类详解
适配器模式分为类适配器,对象适配器和接口适配器模式。
1、类适配器
如图所示,适配器继承了Adaptee插头类,实现了Target接口,外部客户端就能同时调用到插头并且实现插座。
代码过多就不是很好理解了,我就贴以下一点代码:
public class Adapter extends Adaptee implements Target {
@Override
public void method1() {
super.method2();
}
}
Adapter与Adaptee是继承关系,这决定了这是一个类适配器模式。
2、对象适配器
如图所示,适配器类内部封装了Adaptee对象,实现了Target接口。
代码如下:
@Data
public class Adapter implements Target {
//封装了adaptee,且默认有构造函数
private Adaptee adaptee;
public Adapter (Adaptee adaptee) {
// TODO Auto-generated constructor stub
this.adaptee= adaptee;
}
@Override
public void method1() {
adaptee.method2();
adaptee......
//此处可以扩展其他逻辑,也是对象适配器优于类适配器的地方
}
}
类适配器和对象适配器区别:
1、类适配器使用的是继承的方式,无法对Adaptee的其他子类进行适配。
2、对象适配器使用的是组合的方式,Adaptee及其子孙类都可以被适配。对象适配器扩展性更强。
3、基于组合/聚合优于继承。
3、接口适配器
接口适配器模式为一个接口提供缺省实现,这样子类可以从这个缺省实现进行扩展,而不必从原有接口进行扩展。
如图所示,插座有很多插口,但是我现在只需要一个,另外两个不需要,这时候加一个通用的适配器(抽象类),然后专用适配器继承重写方法就好了。
三、适配器应用
在 Spring 的 Aop 中,适配器模式应用的非常广泛。Spring 使用 Advice(通知)来增强被代理类的功能,Advice 的类型主要有 BeforeAdvice、AfterReturningAdvice、ThrowsAdvice。每种 Advice 都有对应的拦截器,即 MethodBeforeAdviceInterceptor、AfterReturningAdviceInterceptor、ThrowsAdviceInterceptor。