适配器设计模式是结构化设计模式 的一种,它的使用是为了让两个不相关的接口能够一起工作。连接这些不相关接口的对象称为** 适配器** 。
适配器设计模式
适配器设计模式的一个很好的真实例子是移动充电器。移动电池需要3伏才能充电,但普通插座只能充电120伏(美国)或240伏(印度)。因此,移动充电器作为移动充电插座和墙上插座之间的适配器。在本教程中,我们将尝试使用适配器设计模式实现多适配器。因此,首先我们将有两个类别-‘Volt’(用于测量伏特)和
Socket
(产生120V的恒定电压)。
1package com.journaldev.design.adapter;
2
3public class Volt {
4
5 private int volts;
6
7 public Volt(int v){
8 this.volts=v;
9 }
10
11 public int getVolts() {
12 return volts;
13 }
14
15 public void setVolts(int volts) {
16 this.volts = volts;
17 }
18
19}
1package com.journaldev.design.adapter;
2
3public class Socket {
4
5 public Volt getVolt(){
6 return new Volt(120);
7 }
8}
现在,我们想要构建一种可以产生3伏、12伏和默认120伏的适配器。因此,首先我们将使用这些方法创建一个适配器接口。
1package com.journaldev.design.adapter;
2
3public interface SocketAdapter {
4
5 public Volt get120Volt();
6
7 public Volt get12Volt();
8
9 public Volt get3Volt();
10}
双向适配器模式
在实现Adapter模式时,有两种方法--类适配器和对象适配器--但这两种方法产生的结果相同。
1.类适配器 -此表单使用** Java inheritance** 并扩展了源接口,在本例中为Socket类。 2.对象适配器 -该表单使用** JAVA Composition** ,适配器包含源对象。
适配器设计模式-类适配器
下面是我们的适配器的类适配器 方法实现。
1package com.journaldev.design.adapter;
2
3//Using inheritance for adapter pattern
4public class SocketClassAdapterImpl extends Socket implements SocketAdapter{
5
6 @Override
7 public Volt get120Volt() {
8 return getVolt();
9 }
10
11 @Override
12 public Volt get12Volt() {
13 Volt v= getVolt();
14 return convertVolt(v,10);
15 }
16
17 @Override
18 public Volt get3Volt() {
19 Volt v= getVolt();
20 return convertVolt(v,40);
21 }
22
23 private Volt convertVolt(Volt v, int i) {
24 return new Volt(v.getVolts()/i);
25 }
26
27}
适配器设计模式-对象适配器实现
下面是我们的适配器的对象适配器 实现。
1package com.journaldev.design.adapter;
2
3public class SocketObjectAdapterImpl implements SocketAdapter{
4
5 //Using Composition for adapter pattern
6 private Socket sock = new Socket();
7
8 @Override
9 public Volt get120Volt() {
10 return sock.getVolt();
11 }
12
13 @Override
14 public Volt get12Volt() {
15 Volt v= sock.getVolt();
16 return convertVolt(v,10);
17 }
18
19 @Override
20 public Volt get3Volt() {
21 Volt v= sock.getVolt();
22 return convertVolt(v,40);
23 }
24
25 private Volt convertVolt(Volt v, int i) {
26 return new Volt(v.getVolts()/i);
27 }
28}
请注意,这两个适配器实现几乎相同,并且它们实现了SocketAdapter
接口。适配器接口也可以是抽象class .以下是使用我们的适配器设计模式实现的测试程序。
1package com.journaldev.design.test;
2
3import com.journaldev.design.adapter.SocketAdapter;
4import com.journaldev.design.adapter.SocketClassAdapterImpl;
5import com.journaldev.design.adapter.SocketObjectAdapterImpl;
6import com.journaldev.design.adapter.Volt;
7
8public class AdapterPatternTest {
9
10 public static void main(String[] args) {
11
12 testClassAdapter();
13 testObjectAdapter();
14 }
15
16 private static void testObjectAdapter() {
17 SocketAdapter sockAdapter = new SocketObjectAdapterImpl();
18 Volt v3 = getVolt(sockAdapter,3);
19 Volt v12 = getVolt(sockAdapter,12);
20 Volt v120 = getVolt(sockAdapter,120);
21 System.out.println("v3 volts using Object Adapter="+v3.getVolts());
22 System.out.println("v12 volts using Object Adapter="+v12.getVolts());
23 System.out.println("v120 volts using Object Adapter="+v120.getVolts());
24 }
25
26 private static void testClassAdapter() {
27 SocketAdapter sockAdapter = new SocketClassAdapterImpl();
28 Volt v3 = getVolt(sockAdapter,3);
29 Volt v12 = getVolt(sockAdapter,12);
30 Volt v120 = getVolt(sockAdapter,120);
31 System.out.println("v3 volts using Class Adapter="+v3.getVolts());
32 System.out.println("v12 volts using Class Adapter="+v12.getVolts());
33 System.out.println("v120 volts using Class Adapter="+v120.getVolts());
34 }
35
36 private static Volt getVolt(SocketAdapter sockAdapter, int i) {
37 switch (i){
38 case 3: return sockAdapter.get3Volt();
39 case 12: return sockAdapter.get12Volt();
40 case 120: return sockAdapter.get120Volt();
41 default: return sockAdapter.get120Volt();
42 }
43 }
44}
当我们运行上面的测试程序时,我们得到以下输出。
1v3 volts using Class Adapter=3
2v12 volts using Class Adapter=12
3v120 volts using Class Adapter=120
4v3 volts using Object Adapter=3
5v12 volts using Object Adapter=12
6v120 volts using Object Adapter=120
适配器设计模式类图
中的适配器模式类图、适配器设计模式、适配器模式、适配器设计模式
JDK中的适配器设计模式示例
我在JDK类中可以很容易地找到一些适配器设计模式示例;
- java.util.Array# asList()
- java.io.InputStreamReader(InputStream)(返回Reader)
- java.io.OutputStreamWriter(OutputStream)(返回Writer)
这就是Java中的适配器设计模式。