适配器模式

类图

代码

电压类(辅助类, 方便理解)

1
2
3
4
5
6
7
8
/**
* 电压
*/
interface Voltage{

Power provide();

}

110V电压类(目标类 Target)

1
2
3
interface V110 extends Voltage{

}

220V电压类(辅助类, 方便理解)

1
2
3
interface V220 extends Voltage{

}

电能(辅助类, 方便理解)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Power{

private String name;

public String getName() {
return name;
}

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

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

@Override
public String toString() {
return "电器电压=" + name + '}';
}
}

客户端类(Client)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Hotel{

private V110 v110;

public V110 getV110() {
return v110;
}

public void setV110(V110 v110) {
this.v110 = v110;
}

public void use(){
System.out.println("德国宾馆开始使用电器:" + v110.toString());
}
}

德标电压类(ConcreteTarget,只是为了演示用)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class GermanStandard implements V110{

private Power power = new Power("110V");

@Override
public Power provide() {
return power;
}

@Override
public String toString() {
return "德国标准{" + power +'}';
}
}

中国标准电压类(Adaptee,被适配类)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class ChineseStandard implements V220{

private Power power = new Power("220V");

@Override
public Power provide() {
return power;
}

@Override
public String toString() {
return "中国标准{" + power + '}';
}
}

适配器类,核心(相当于Adapter类)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class V220toV110 implements V110{

private V220 v220;

public V220toV110(V220 v220) {
this.v220 = v220;
}

@Override
public Power provide() {
return v220.provide();
}

@Override
public String toString() {
return "转换器{" + v220 + '}';
}
}

测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Client {
public static void main(String args[]){

Hotel hotel = new Hotel();

V110 tv = new GermanStandard();
hotel.setV110(tv);
hotel.use();

V220 pc = new ChineseStandard();
//很显然这不可行,你不可能让宾馆凿墙特制220V的插座
//hotel.setV110(pc);
hotel.setV110(new V220toV110(pc));

hotel.use();
}
}

输出结果

1
2
德国宾馆开始使用电器:德国标准{电器电压=110V}}
德国宾馆开始使用电器:转换器{中国标准{电器电压=220V}}}

总结

概述

JAVA底层OutputStream有适配器ByteArrayOutputStream

注意: UML图和例子都是接口的适配,与正统的适配器模式略有差异

我举的这个例子可能有些繁琐,实际上核心就是一句话概括

德国宾馆用的插座电压是110V的,中国标准的电器的电话是220V的,为了让中国电器能在德国使用

中国标准电器 -> 适配器 -> 德国标准 -> 正常使用

优点

增加了被适配类的复用性

缺点