Java 中的适配器设计模式

适配器设计模式是结构化设计模式 的一种,它的使用是为了让两个不相关的接口能够一起工作。连接这些不相关接口的对象称为** 适配器** 。

适配器设计模式

适配器设计模式,Java中的适配器设计模式,适配器模式,适配器模式Java example适配器设计模式的一个很好的真实例子是移动充电器。移动电池需要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

适配器设计模式类图

java中的适配器模式类图、适配器设计模式、适配器模式、适配器设计模式

JDK中的适配器设计模式示例

我在JDK类中可以很容易地找到一些适配器设计模式示例;

  • java.util.Array# asList()
  • java.io.InputStreamReader(InputStream)(返回Reader)
  • java.io.OutputStreamWriter(OutputStream)(返回Writer)

这就是Java中的适配器设计模式。

Published At
Categories with 技术
comments powered by Disqus