定义
适配器模式(Adapter Pattern) :将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。
相关角色
Target:目标抽象类
Adapter:适配器类
Adaptee:适配者类
Client:客户类
解决问题
使接口不兼容的那些类可以一起工作。
UML类图

例子
适配器分两种
- 类的适配器
- 对象适配器
具体场景是: 在生活中,我们买的电器插头是2个孔的,但是我们买的插座只有三个孔的,此时我们就希望电器的插头可以转换为三个孔的,这样我们就可以直接把它插在插座上,此时三个孔插头就是客户端期待的另一种接口,自然两个孔的插头就是现有的接口。
类的适配器
IThreeHole
public interface IThreeHole {
void request();
}
TwoHole
public abstract class TwoHole {
public void specificRequest()
{
System.out.println("我是两个孔的插头");
}
}
PowerAdapter
public class PowerAdapter extends TwoHole implements IThreeHole {
@Override
public void request() {
this.specificRequest();
}
}
对象适配器
TwoHole
public class TwoHole {
public void specificRequest() {
System.out.println("我是两个孔的插头");
}
}
ThreeHole
public abstract class ThreeHole {
public abstract void request();
}
PowerAdapter
public class PowerAdapter extends ThreeHole {
private TwoHole twoHole = new TwoHole();
@Override
public void request() {
twoHole.specificRequest();
}
}
优缺点
类的适配器模式
优点:
- 可以在不修改原有代码的基础上来复用现有类,很好地符合 “开闭原则”;
- 可以重新定义Adaptee(被适配的类)的部分行为,因为在类适配器模式中,Adapter是Adaptee的子类;
- 仅仅引入一个对象,并不需要额外的字段来引用Adaptee实例(这个即是优点也是缺点)。
缺点: - 用一个具体的Adapter类对Adaptee和Target进行匹配,当如果想要匹配一个类以及所有它的子类时,类的适配器模式就不能胜任了。因为类的适配器模式中没有引入Adaptee的实例,光调用this.SpecificRequest方法并不能去调用它对应子类的SpecificRequest方法;
- 采用了 “多继承”的实现方式,带来了不良的高耦合。
对象的适配器模式
优点:
- 可以在不修改原有代码的基础上来复用现有类,很好地符合 “开闭原则”(这点是两种实现方式都具有的);
- 采用 “对象组合”的方式,更符合松耦合。
缺点: - 使得重定义Adaptee的行为较困难,这就需要生成Adaptee的子类并且使得Adapter引用这个子类而不是引用Adaptee本身。
网友评论