结构型-适配器模式
# 什么是适配器模式
- 英文名称:Adapter Design Pattern
- 将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。
- 适配器模式
- 类适配器,使用继承关系来实现。
- 对象适配器,使用组合关系来实现。
- 使用区别
- 如果 Adaptee 接口不多,上述两种方式都可以。
- 如果 Adaptee 接口很多,而且 Adaptee 和 ITarget 接口定义大部分相同,我们使用类适配器方式。
- 如果 Adaptee 接口很多,但是两者内部定义大部分不相同,那么推荐使用对象适配器。
# 为什么用适配器模式
- 封装有缺陷的接口设计
- 适配器模式的应用场景是“接口不兼容”。
- 统一多个类的接口设计
- 替换依赖的外部系统
- 兼容老版本接口
- 适配不同格式的数据
# 适配器应用场景
- Slf4j 日志框架,只定义了接口,其中涉及到不同的日志适配。
- 使用数组实现堆、栈功能,其实底层也是对应的适配操作。
# 适配器示例代码
public interface IVga {
public void openVga();
}
public class VgaDisplay implements IVga {
@Override
public void openVga() {
System.out.println("Openning ... VGA ... monitor");
}
}
public interface IHdmi {
public void openHdmi();
}
public class Vga2HdmiAdapter implements IHdmi {
private IVga vga;
public Vga2HdmiAdapter(IVga vga) {
this.vga = vga;
}
@Override
public void openHdmi() {
vga.openVga();
System.out.println("Openning HDMI device.....");
System.out.println("适配完成");
}
}
public class App {
public static void main(String[] args) {
System.out.println("Hello World!");
VgaDisplay vgaDisplay = new VgaDisplay();
Vga2HdmiAdapter vga2HdmiAdapter = new Vga2HdmiAdapter(vgaDisplay);
operateHdmiLaptop(vga2HdmiAdapter);
}
private static void operateHdmiLaptop(Vga2HdmiAdapter vga2HdmiAdapter) {
vga2HdmiAdapter.openHdmi();
System.out.println("HDMI 显示器调用成功了");
}
}
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 代理、桥接、装饰器、适配器 4 种设计模式的区别
- 代理模式:代码模式在不太变原始类接口的条件下,为原始类定义一个代理类,主要目的是控制访问,而非功能加强,这是它跟装饰器模式最大的不同。
- 桥接模式:将接口部分和实现部分分离,从而让他们可以较为容易、也相对独立地加以改变。
- 装饰器模式:在不改变原始类接口的情况下,对原始类功能进行增强,并且支持多个装饰器的嵌套使用。
- 适配器模式:一种事后的补救策略,适配器提供跟原始类不同的接口,而代理模式、装饰器模式提供的都是跟原始类相同的接口。
上次更新: 2020/09/08, 15:09:00