适配器的定义
适配器模式(Adapter Design Pattern)顾名思义,这个模式是用来做适配的,它可以将不兼容的接口转换为可以兼容的接口,让原本由于接口不兼容而不能在一起工作的类可以一起工作。
适配器模式有两种实现方式:类适配器和对象适配器,其中类对象适配器使用的是继承关系来实现的,对象适配器使用组合关系来实现。
适配器的应用
封装有缺陷的接口设计
假设我们依赖的外部系统在接口设计方面有缺陷(比如包含大量静态方法),引入之后会影响到我们自身代码的可测试性,为了隔离设计上的缺陷,我们希望对外部系统提供的接口进行二次封装,抽象出更好的接口设计
统计多个类的接口设计
替换依赖的外部系统
兼容老版本接口
适配不同格式的数据
适配器模式角色
-
Target目标角色
该角色定义把其他类转换为何种接口,也就是我们期望的接口,例子中IUserInfo接口就是目标角色
-
Adaptee源角色
你想把谁转换成目标角色,谁就是源角色,它是已经存在的,运行良好的类,经过适配器的包装,他会变成一个崭新的角色
-
Adapter适配器角色
适配器模式的核心角色,其他两个都是已经存在的角色,而适配器角色是需要新设计的,他的职责很简单,把源角色转换成目标角色,通过继承或者类关联的方式
实例
// 类适配器: 基于继承
public interface ITarget {
void f1();
void f2();
void fc();
}
public class Adaptee {
public void fa() { //... }
public void fb() { //... }
public void fc() { //... }
}
public class Adaptor extends Adaptee implements ITarget {
public void f1() {
super.fa();
}
public void f2() {
//...重新实现f2()...
}
// 这里fc()不需要实现,直接继承自Adaptee,这是跟对象适配器最大的不同点
}
// 对象适配器:基于组合
public interface ITarget {
void f1();
void f2();
void fc();
}
public class Adaptee {
public void fa() { //... }
public void fb() { //... }
public void fc() { //... }
}
public class Adaptor implements ITarget {
private Adaptee adaptee;
public Adaptor(Adaptee adaptee) {
this.adaptee = adaptee;
}
public void f1() {
adaptee.fa(); //委托给Adaptee
}
public void f2() {//...重新实现f2()...}
public void fc() {adaptee.fc();}
}