结构设计模式 - 适配器设计模式
适配器设计模式是结构设计模式之一,其使用使得两个不相关的接口可以一起工作。连接这些不相关接口的对象称为适配器。
目录[ 隐藏 ]
适配器设计模式
适配器设计模式的一个重要现实例子是移动充电器。移动电池需要3伏电压才能充电,但普通插座需要120V(美国)或240V(印度)。因此,移动充电器可作为移动充电插座和墙壁插座之间的适配器。
我们将尝试使用本教程中的适配器设计模式实现多适配器。
首先,我们将有两个类 - Volt
(测量电压)和Socket
(产生120V的恒定电压)。
package com.journaldev.design.adapter;
public class Volt {
private int volts;
public Volt(int v){
this.volts=v;
}
public int getVolts() {
return volts;
}
public void setVolts(int volts) {
this.volts = volts;
}
}
package com.journaldev.design.adapter;
public class Socket {
public Volt getVolt(){
return new Volt(120);
}
}
现在我们要构建一个可以产生3伏,12伏和默认120伏的适配器。首先,我们将使用这些方法创建一个适配器接口。
package com.journaldev.design.adapter;
public interface SocketAdapter {
public Volt get120Volt();
public Volt get12Volt();
public Volt get3Volt();
}
双向适配器模式
在实现Adapter模式时,有两种方法 - 类适配器和对象适配器 - 但是这两种方法都产生相同的结果。
- 类适配器 - 此表单使用java继承并扩展源接口,在我们的案例中为Socket类。
- 对象适配器 - 此表单使用Java Composition,而适配器包含源对象。
适配器设计模式 - 类适配器
这是我们的适配器的类适配器方法实现。
package com.journaldev.design.adapter;
//Using inheritance for adapter pattern
public class SocketClassAdapterImpl extends Socket implements SocketAdapter{
@Override
public Volt get120Volt() {
return getVolt();
}
@Override
public Volt get12Volt() {
Volt v= getVolt();
return convertVolt(v,10);
}
@Override
public Volt get3Volt() {
Volt v= getVolt();
return convertVolt(v,40);
}
private Volt convertVolt(Volt v, int i) {
return new Volt(v.getVolts()/i);
}
}
适配器设计模式 - 对象适配器实现
这是我们的适配器的Object适配器实现。
package com.journaldev.design.adapter;
public class SocketObjectAdapterImpl implements SocketAdapter{
//Using Composition for adapter pattern
private Socket sock = new Socket();
@Override
public Volt get120Volt() {
return sock.getVolt();
}
@Override
public Volt get12Volt() {
Volt v= sock.getVolt();
return convertVolt(v,10);
}
@Override
public Volt get3Volt() {
Volt v= sock.getVolt();
return convertVolt(v,40);
}
private Volt convertVolt(Volt v, int i) {
return new Volt(v.getVolts()/i);
}
}
请注意,两个适配器实现几乎相同,并且它们实现了SocketAdapter
接口。适配器接口也可以是抽象类。
这是一个使用我们的适配器设计模式实现的测试程序。
package com.journaldev.design.test;
import com.journaldev.design.adapter.SocketAdapter;
import com.journaldev.design.adapter.SocketClassAdapterImpl;
import com.journaldev.design.adapter.SocketObjectAdapterImpl;
import com.journaldev.design.adapter.Volt;
public class AdapterPatternTest {
public static void main(String[] args) {
testClassAdapter();
testObjectAdapter();
}
private static void testObjectAdapter() {
SocketAdapter sockAdapter = new SocketObjectAdapterImpl();
Volt v3 = getVolt(sockAdapter,3);
Volt v12 = getVolt(sockAdapter,12);
Volt v120 = getVolt(sockAdapter,120);
System.out.println("v3 volts using Object Adapter="+v3.getVolts());
System.out.println("v12 volts using Object Adapter="+v12.getVolts());
System.out.println("v120 volts using Object Adapter="+v120.getVolts());
}
private static void testClassAdapter() {
SocketAdapter sockAdapter = new SocketClassAdapterImpl();
Volt v3 = getVolt(sockAdapter,3);
Volt v12 = getVolt(sockAdapter,12);
Volt v120 = getVolt(sockAdapter,120);
System.out.println("v3 volts using Class Adapter="+v3.getVolts());
System.out.println("v12 volts using Class Adapter="+v12.getVolts());
System.out.println("v120 volts using Class Adapter="+v120.getVolts());
}
private static Volt getVolt(SocketAdapter sockAdapter, int i) {
switch (i){
case 3: return sockAdapter.get3Volt();
case 12: return sockAdapter.get12Volt();
case 120: return sockAdapter.get120Volt();
default: return sockAdapter.get120Volt();
}
}
}
当我们运行上面的测试程序时,我们得到以下输出。
v3 volts using Class Adapter=3
v12 volts using Class Adapter=12
v120 volts using Class Adapter=120
v3 volts using Object Adapter=3
v12 volts using Object Adapter=12
v120 volts using Object Adapter=120
适配器设计模式类图
JDK中的适配器设计模式示例
我可以在JDK类中轻松找到的一些适配器设计模式示例;
- java.util.Arrays中#asList()
- java.io.InputStreamReader(InputStream)(返回一个Reader)
- java.io.OutputStreamWriter(OutputStream)(返回一个Writer)
这就是java中适配器设计模式的全部内容。