适配器模式

适配器模式(Adapter Pattern)充当两个不兼容接口之间的桥梁,属于结构型设计模式。它通过一个中间件(适配器)将一个类的接口转换成客户期望的另一个接口,使原本不能一起工作的类能够协同工作。

这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。

类图示例

适配器模式.png

举个例子

球员姚明刚来到NBA,听不懂教练布置的战术,所以需要一个翻译来解释教练的战术。这个翻译就是适配器

类图

NBA适配器.png

代码实现

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
//球员抽象类
abstract class Player {
protected String name;

public Player(String name) {
this.name = name;
}

public abstract void Attack();

public abstract void Defense();
}

//前锋类
class Forwards extends Player {
public Forwards(String name) {
super(name);
}

public void Attack() {
System.out.println("前锋" + name + "进攻");
}

public void Defense() {
System.out.println("前锋" + name + "防守");
}
}

//中锋类
class Center extends Player {
public Center(String name) {
super(name);
}

public void Attack() {
System.out.println("中锋" + name + "进攻");
}

public void Defense() {
System.out.println("中锋" + name + "防守");
}
}

//后卫类
class Guard extends Player {
public Guard(String name) {
super(name);
}

public void Attack() {
System.out.println("后卫" + name + "进攻");
}

public void Defense() {
System.out.println("后卫" + name + "防守");
}
}

//姚明属于外籍中锋
class ForeignCenter {
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public void jingong() {
System.out.println("外籍中锋" + name + "进攻");
}

public void fangshou() {
System.out.println("外籍中锋" + name + "防守");
}
}

//适配器类,既要懂英语(继承Player类),也要会中文
class Translator extends Player {
private ForeignCenter foreignCenter = new ForeignCenter();

public Translator(String name) {
super(name);
foreignCenter.setName(name);
}

public void Attack() {
foreignCenter.jingong();
}

public void Defense() {
foreignCenter.fangshou();
}
}

public class Adapter {
public static void main(String[] args) {
Player b = new Forwards("巴蒂尔");
b.Attack();
Player m = new Guard("麦克格雷迪");
m.Attack();
Player y = new Translator("姚明");
y.Defense();
}
}

适配器模式包含以下几个主要角色:

  1. 目标接口(Target):定义客户需要的接口。
  2. 适配者类(Adaptee):定义一个已经存在的接口,这个接口需要适配。
  3. 适配器类(Adapter):实现目标接口,并通过组合或继承的方式调用适配者类中的方法,从而实现目标接口。

模式分析

  • 优点
    1. 促进了类之间的协同工作,即使它们没有直接的关联。
    2. 提高了类的复用性。
    3. 增加了类的透明度。
    4. 提供了良好的灵活性。
  • 缺点
    1. 过度使用适配器可能导致系统结构混乱,难以理解和维护。
    2. 在Java中,由于只能继承一个类,因此只能适配一个类,且目标类必须是抽象的。