设计模式之结构型设计模式-适配器模式

1. 模式简介

将一个原有的类的接口转换成期望的另一个接口,使原本的接口不兼容的类可以一起工作。属于结构型设计模式

2. 示例代码

这里我们模拟一个现实生活中的例子,之前电脑的接口都是 USB 接口,现在很多设备新增了 Type-C 接口,为了兼容,出了一种转接头设备,将 USB 接口输出变成 Type-C 接口输出。

  • USB 接口类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* <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 接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* <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 转接头
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* <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;
}
}
  • 测试类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* <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();
}
}
  • 测试结果
1
2
3
接口类型:USB
使用 USB 转 Type-C 转接头
接口类型:Type-C

3. UML 图例

design-pattern-adapter-uml

4. 应用

1
2
3
// Spring MVC 中的 HandlerAdapter

// Spring AOP 中的 AdvisorAdapter

5. 场景

  • 已经存在的类,它的方法和需求不匹配(方法结果相同或相似)的情况。

  • 适配器模式不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品、不同厂家造成功能类似而接口不相同情况下的解决 方案。

6. 优缺点

优点: 1、能提高类的透明性和复用,现有的类复用但不需要改变。 2、目标类和适配器类解耦,提高程序的扩展性。 3、在很多业务场景中符合开闭原则。

缺点: 1、适配器编写过程需要全面考虑,可能会增加系统的复杂性。2、增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱。

7. 完整代码地址

https://github.com/xkcoding/design-pattern/tree/master/src/main/java/com/xkcoding/design/pattern/structural/adapter

-------------本文结束  感谢您的阅读-------------
o(╯□╰)o我只要一毛钱的鼓励~~