核心思想
- 见名知意,是作为两个不兼容的接口的桥梁,属于结构型模式
- 使得原来由于接口不兼容而不能一起工作的那些类可以一起工作
常见的几类适配器
- 类的适配器模式
- 想将一个类转换成满足另外一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可
- 对象的适配器模式
- 想将一个对象转换成满足另外一个接口的对象时,可以创建一个适配器类,持有原类的一个实例,在适配类的方法中,调用实例的方法就行
- 接口的适配器模式
- 不想实现一个接口中得所有方法时,可以创建一个适配器,实现所有方法,在写别的类的时候,继承适配器类即可
场景使用
- 在使用一些旧系统或者是类库时,经常会出现接口不兼容的问题,适配器模式在解决这类问题具有优势
- 学习设计模式一定不要局限代码层面,要从软件系统整体去考虑,而不是为了使用设计模式,而去使用设计模式
优缺点
优点
- 可以让任何两个没有关联的类一起运行,使得原本由于接口不兼容而不能一起工作的那些类一起工作
- 增强灵活度,提高复用性,适配器可以在多个系统使用,符合开闭原则
缺点
- 整体类的调用链路增加
- 比如 本来
A
可以直接调用C
,使用适配器后是A
调用B
,B
再调用C
- 比如 本来
代码示例(类的适配器模式)
类图
旧的原始类
java
public class OldModule {
public void methodA(){
System.out.println("OldModule methodA");
}
}
新的目标接口
java
public interface TargetModule {
/**
* 和需要适配的类方法名一样
*/
void methodA();
/**
* 新的方法,如果有多个新的方法直接编写就行
*/
void methodB();
void methodC();
}
适配器
java
public class Adapter extends OldModule implements TargetModule {
/**
* 新的方法,和老的类方法不一样
*/
@Override
public void methodB() {
System.out.println("Adapter methodB");
}
/**
* 新的方法,和老的类方法不一样
*/
@Override
public void methodC() {
System.out.println("Adapter methodC");
}
}
测试
java
public class AppRun {
public static void main(String[] args) {
TargetModule targetModule = new Adapter();
targetModule.methodA();
targetModule.methodB();
targetModule.methodC();
}
}