设计模式笔记 - 适配器模式(Adapter Pattern)

模式定义

适配器模式(Adapter Pattern)将一个接口转换成客户希望的另外一个接口,使得与客户现有接口不兼容的第三方接口可以与其一起正常工作


模式结构

适配器模式包含如下角色:

  • Target:目标抽象类(或接口)
  • Adapter:适配器类
  • Adaptee:适配者类
  • Client:客户类

适配器模式有对象适配器(针对于组合)和类适配器(针对于多重继承)两种实现,以下重点讲述对象适配器实现:

img


模式实例

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
/* 
* 此例为英标插头提供能够正常插入国标插座的转换器。不过省去调节电压等细
* 节。
*/
// Target - 目标抽象类(或接口)
public class ChinaSocket {

public void workInAWay() {
System.out.println("You are using ChinaScoket");
}
}

// Adaptee - 适配者类
public class EnglandSocket {

public void workInBWay() {
System.out.println("You are using EnglandSocket");
}
}

// Adapter - 适配器类
public class ChinaScoketAdapter {
EnglandScoket englandScoket;

public ChinaScoketAdapter(EnglandScoket englandScoket) {
this.englandScoket = englandScoket;
}

public void workInAWay() {
englandScoket.workInBWay();
}
}

// Client - 客户端
public class Test {
public static void main(String[] args) {
ChinaSocket chinaSocket = new ChinaSocket();
EnglandSocket englandSocket = new EnglandSocket();
ChinaScoketAdapter adapter = new ChinaScoketAdapter(englandSocket);

chinaSocket.workInAWay();
adapter.workInAWay();
}
}

模式分析

  • 适配器提供客户类需要的接口,适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用。也就是说:当客户类调用适配器的方法时,在适配器类的内部将调用适配者类的方法,而这个过程对客户类是透明的,客户类并不直接访问适配者类。因此,适配器可以使由于接口不兼容而不能交互的类可以一起工作。

适配器模式的优点:

  • 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无须修改原有代码。
  • 增加了类的透明性和复用性。将具体的实现封装在适配者类中,对于客户端来说是透明的,而且提高了适配者的复用性。
  • 对于对象适配器来说,同一适配器可以兼容适配者类以及它的子类到目标接口中。

适配器模式的缺点:

  • 若要更改适配器的接口的时候,则需要修改其所兼容适配器的所有接口,维护的难度较大。


参考资料:

[1] https://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/adapter.html