Java设计模式之——适配器模式
适配器模式是结构化设计模式的一种。
它可以让两个没有联系的接口一起使用。将这些没有联系的接口结合起来的对象就是适配器。
现实生活的例子,我们可以把手机充电器作为一个适配器,因为手机电池需要3伏特充电,但正常的插座产生120V(美国) 或240V(印度)。因此手机充电器可以作为移动充电插座和电源插座之间的适配器。
本文将通过适配器模式实现多适配器。
首先,创建两个类 -Volt(测量伏特)和Socket(生产120V恒定电压)
Volt.java
public class Volt{
private int volts;
public Volt(int volts){
this.volts = volts;
}
public int getVolts(){
return this.volts;
}
public void setVolts(int volts){
this.volts = volts;
}
}
Socket.java
public class Socket{
public Volt getVolts(){
return new Volt(120);
}
}
现在我们想创建一个可以生产3V,12V和默认120V的适配器,首先我们创建一个带有这些方法的接口。
两种方式的适配器模式:
当实现适配器模式的时候,有两种方法:
- 类适配器,这种形式使用Java继承和扩展了源接口,如Socket类
对象适配器,这种形式使用Java组成的适配器包含源对象
类适配器的实现:
public class SocketClassAdapterImpl extends Socket implements SocketAdapter{
@Override
public Volt get30Volt(){
Volt v = getVolts();
return this.convertor(v, 4);
}
@Override
public Volt get120Volt(){
return getVolts();
}
@Override
public Volt get3Volt(){
Volt v = getVolts();
return convertor(v, 40);
}
private Volt convertor(Volt v, int i){
return new Volt(v.getVolts()/i);
}
}
对象适配器的实现
public class SocketObjectAdapterImpl implements SocketAdapter{
private Socket sock = new Socket();
@Override
public Volt get30Volt(){
Volt v = sock.getVolts();
return convertor(v, 4);
}
@Override
public Volt get3Volt(){
Volt v = sock.getVolts();
return convertor(v, 40);
}
private Volt convertor(Volt v, int i){
return new Volt(v.getVolts()/i);
}
}
测试代码:
// AdapterPatternTest.java
public class AdapterPatternTest{
public static void main(String[] args){
testClassAdapter();
testObjectAdapter();
}
public static void testClassAdapter(){
SocketAdapter socketAdapter = new SocketClassAdapterImpl();
System.out.println("class adapter is get3Volt:" + socketAdapter.get3Volt().getvolts());
System.out.println("class adapter is get30Volt:" + socketAdapter.get30Volt().getvolts());
System.out.println("class adapter is get120Volt:" + socketAdapter.get120Volt().getvolts());
}
public static void testObjectAdapter(){
SocketAdapter socketAdapter = new SocketObjecterImpl();
System.out.println("object adapter is get3Vot:"+socketAdapter.get3Volt().getVolts());
System.out.println("object adapter is get30Vot:"+socketAdapter.get30Volt().getVolts());
System.out.println("object adapter is get120Vot:"+socketAdapter.get120Volt().getVolts());
}
}
在JDK中适配器模式示例:
java.util.Arrays # asList()
java.io.InputStreamReader(InputStream) (return a Reader)
java.io.OutputStreamWriter(OutputStream) (return a Writer)