Java设计模式学习之适配器模式
适配器模式是结构型模式中的一种,他经常用于将两个没有联系的接口进行适配,使之可以结合使用。其中联合不相关接口的对象就是成为适配器。
就拿现实生活中的手机充电器举例子,我们就可以把手机充电器当做适配器,因为一般的插座电源都是220V的,但是手机电池是3V的,手机充电器就在手机电源和一般插座之间充当适配器的作用。
现在我们就拿这个例子来使用java实现适配器模式。
首先,我们实现两个类,Volt 和 Socket 类
Volt.java1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21package com.walterlife.dp.AdapterDP;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
public class Volt {
private int volts;
static Logger logger = Logger.getLogger(Volt.class);
public Volt(int v) {
this.volts = v;
}
public void setVolts(int v) {
this.volts = v;
}
public int getVolts() {
return this.volts;
}
}
Socket.java1
2
3
4
5
6
7package com.walterlife.dp.AdapterDP;
public class Socket {
public Volt getVolt() {
return new Volt(220);
}
}
现在我们开始实现产生3种 volts(3V, 12V, 220V)的电源适配器。所以首先创建一个适配器接口类来定义获得vlot的方法
SocketAdapter.java1
2
3
4
5
6
7
8
9package com.walterlife.dp.AdapterDP;
public interface SocketAdapter {
public Volt get220Volt();
public Volt get12Volt();
public Volt get3Volt();
}
两种适配器模式实现方法
Class Adapter 通过Java extends 来继承 源对象, 比如 Socket
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24package com.walterlife.dp.AdapterDP;
public class SocketClassAdapterImpl extends Socket implements SocketAdapter {
public Volt get220Volt() {
return getVolt();
}
public Volt get12Volt() {
return convertVolt(getVolt(), 10);
}
public Volt get3Volt() {
return convertVolt(getVolt(), 40);
}
private Volt convertVolt(Volt v, int multi) {
if(v == null) {
logger.error("param Volt v is not valid !!!");
return null;
}
return new Volt(v.getVolts() / multi);
}
}Object Adapter 通过Java 组合,使Adapter 包含源对象
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
29package com.walterlife.dp.AdapterDP;
import org.apache.log4j.Logger;
public class SocketClassAdapterImpl implements SocketAdapter {
static Logger logger = Logger.getLogger(SocketClassAdapterImpl.class);
private Socket socket = new Socket();
public Volt get220Volt() {
return socket.getVolt();
}
public Volt get12Volt() {
return convertVolt(socket.getVolt(), 18);
}
public Volt get3Volt() {
return convertVolt(socket.getVolt(), 40);
}
private Volt convertVolt(Volt v, int multi) {
if(v == null) {
logger.error("param Volt v is not valid !!!");
return null;
}
return new Volt(v.getVolts() / multi);
}
}
两种方式最终的结果都是一致的。
当然,Adapter Interface 也可以是一个 Abstract Class
下面是Adapter Pattern 的测试代码
1 | public static Volt getVolt(SocketAdapter adapter, int v) { |
测试结果1
2
3v3 volts: 3
v12 volts: 12
v220 volts: 220