定义
将一个类的接口转换成客户期望的另一个接口
使原本接口不兼容的类可以一起工作
类型
结构型
适用场景
- 已经存在的类,它的方法和需求不匹配时(方法结果相同或相似)
- 不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产产品、不同厂家造成功能类似而接口不相同情况下的解决方案。
优点
- 能提高类的透明性和复用,现有的类复用但不需要改变
- 目标类和适配器类解耦,提高程序扩展性
- 符合开闭原则
缺点
- 适配器编写过程需要全面考虑,可能会增加系统的复杂性
- 增加系统代码可读的难度
扩展
- 对象适配器
符合组合复用原则,使用委托机制
- 类适配器
通过类继承
相关设计模式
- 适配器模式和外观模式
都是对现有的类,现有的系统的封装,外观模式定义了新的接口,而适配器则是复用了一个原有的接口,适配器是使原有的接口协同工作,而外观则是在现有的系统中提供一个更为方便的访问入口,两者最大的区别就是适配的力度不同,外观模式用来适配整个子系统,适配器只适配接口。
- 装饰者模式和适配器模式
两者都可以被称为包装模式,装饰者模式中装饰者和被装饰者可以实现相同的接口,或者装饰者是被装饰者的子类。适配器模式中适配器和被适配的类具有不同的接口,可能会有部分的接口是重合的。
代码
类适配器模式
public class Adaptee {
public void adapteeRequest(){
System.out.println("被适配者的方法");
}
}
目标接口
public interface Target {
void request();
}
public class ConcreteTarget implements Target {
@Override
public void request() {
System.out.println("ConcreteTarget 目标方法");
}
}
适配器
public class Adapter extends Adaptee implements Target {
@Override
public void request() {
super.adapteeRequest();
}
}
测试
public class Test {
public static void main(String[] args) {
Target target = new ConcreteTarget();
target.request();
Target adapterTarget = new Adapter();
adapterTarget.request();
}
}
结果
ConcreteTarget 目标方法
被适配者的方法
Adapter继承了被适配者,同时实现了目标接口
而Target有两种实现,一种使具体的ConcreteTarget实现类,一种通过Adapter变成了Adaptee的实现类
对象适配器
修改Adapter
public class Adapter implements Target {
private Adaptee adapter = new Adaptee();
@Override
public void request() {
adapter.adapteeRequest();
}
}
结果
ConcreteTarget 目标方法
被适配者的方法