Java中的适配器设计模式
时间:2020-02-23 14:36:07 来源:igfitidea点击:
适配器设计模式是结构设计模式之一,它的使用使两个不相关的接口可以一起工作。
加入这些不相关接口的对象称为适配器。
适配器设计模式
现实生活中适配器设计模式的一个很好的例子就是移动充电器。
移动电池需要3伏特才能充电,但普通插座产生的电压为120V(美国)或者240V(旧金山)。
因此,移动充电器可充当移动充电插座和壁式插座之间的适配器。
在本教程中,我们将尝试使用适配器设计模式来实现多适配器。
因此,首先我们将分为两类-"伏特"(用于测量伏特)和"插座"(产生120V的恒定伏特)。
package com.theitroad.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.theitroad.design.adapter; public class Socket { public Volt getVolt(){ return new Volt(120); } }
现在,我们要构建一个可以产生3伏,12伏和默认120伏的适配器。
因此,首先,我们将使用这些方法创建一个适配器接口。
package com.theitroad.design.adapter; public interface SocketAdapter { public Volt get120Volt(); public Volt get12Volt(); public Volt get3Volt(); }
两路适配器模式
在实现适配器模式时,有两种方法-类适配器和对象适配器-但是,这两种方法都会产生相同的结果。
类适配器–这种形式使用Java继承并扩展了源接口,在我们的例子中是Socket类。
对象适配器–此表单使用Java组合,并且适配器包含源对象。
适配器设计模式–类适配器
这是我们的适配器的类适配器方法实现。
package com.theitroad.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); } }
适配器设计模式–对象适配器实现
这是适配器的对象适配器实现。
package com.theitroad.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.theitroad.design.test; import com.theitroad.design.adapter.SocketAdapter; import com.theitroad.design.adapter.SocketClassAdapterImpl; import com.theitroad.design.adapter.SocketObjectAdapterImpl; import com.theitroad.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)