1. 模式简介
将一个原有的类的接口转换成期望的另一个接口,使原本的接口不兼容的类可以一起工作。属于结构型设计模式。
2. 示例代码
这里我们模拟一个现实生活中的例子,之前电脑的接口都是 USB 接口,现在很多设备新增了 Type-C 接口,为了兼容,出了一种转接头设备,将 USB 接口输出变成 Type-C 接口输出。
- USB 接口类
/**
* <p>
* 定义标准的电脑USB接口类
* </p>
*
* @author yangkai.shen
* @date Created in 2019/9/16 17:07
*/
public class Usb {
/**
* 接口类型
*
* @return USB
*/
public String slot() {
String type = "USB";
System.out.println("接口类型:" + type);
return type;
}
}
- Type-C 接口
/**
* <p>
* 新的Type-C接口
* </p>
*
* @author yangkai.shen
* @date Created in 2019/9/16 17:10
*/
public interface TypeC {
/**
* 接口类型
*
* @return USB
*/
String slot();
}
- USB 转 Type-C 转接头
/**
* <p>
* USB接口 转 Type-C接口 转接头
* </p>
*
* @author yangkai.shen
* @date Created in 2019/9/16 17:11
*/
public class TypeCAdapter implements TypeC {
private Usb usb;
public TypeCAdapter(Usb usb) {
this.usb = usb;
}
/**
* 接口类型
*
* @return USB
*/
@Override
public String slot() {
String originalType = usb.slot();
String type = transformSlot(originalType);
System.out.println("接口类型:" + type);
return type;
}
private String transformSlot(String originalType) {
String type = "Type-C";
System.out.println("使用 " + originalType + " 转 " + type + " 转接头");
return type;
}
}
- 测试类
/**
* <p>
* 适配器模式 - 测试类
* </p>
*
* @author yangkai.shen
* @date Created in 2019/9/16 17:15
*/
public class PatternTest {
public static void main(String[] args) {
TypeC typeC = new TypeCAdapter(new Usb());
typeC.slot();
}
}
- 测试结果
接口类型:USB
使用 USB 转 Type-C 转接头
接口类型:Type-C
3. UML 图例
4. 应用
// Spring MVC 中的 HandlerAdapter
// Spring AOP 中的 AdvisorAdapter
5. 场景
-
已经存在的类,它的方法和需求不匹配(方法结果相同或相似)的情况。
-
适配器模式不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品、不同厂家造成功能类似而接口不相同情况下的解决 方案。
6. 优缺点
优点: 1、能提高类的透明性和复用,现有的类复用但不需要改变。 2、目标类和适配器类解耦,提高程序的扩展性。 3、在很多业务场景中符合开闭原则。
缺点: 1、适配器编写过程需要全面考虑,可能会增加系统的复杂性。2、增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱。