Java 适配器模式(Adapter Pattern)

  • by

适配器设计模式是结构模式之一,它可以让不相干的接口在一起工作,而协调这些不相干接口的对象称为适配器。

适配器设计模式

现实生活中适配器设计模式的一个很好的例子就是移动充电器。移动电池需要 3 伏特电源,但普通插座产生的电压为120V(美国)或220V(中国)。 因此,移动充电器可充当手机电源和插座之间的适配器。

本文将尝试使用适配器设计模式来实现多适配器。

首先,创建两个类:Volt(用于测量电压)和 Socket(产生 120V 的恒定电压)。

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;
	}
	
}
public class Socket {

	public Volt getVolt(){
		return new Volt(120);
	}
}

现在要构建一个可以产生 3 伏,12 伏和默认 120 伏的适配器。首先需要创建一个适配器接口。

public interface SocketAdapter {

	public Volt get120Volt();
		
	public Volt get12Volt();
	
	public Volt get3Volt();
}

适配器模式的两种实现方式

实现适配器模式有两种方法:类适配器和对象适配器,这两种方法都会产生相同的结果。

类适配器使用 Java 继承并扩展源接口,也就是 Socket 类。
对象适配器使用 Java 组合,在适配器中包含源对象。

类适配器

下面是类适配器的实现。

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);
	}

}

对象适配器

下面是对象适配器的实现。

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 接口。当然适配器接口也可以是抽象类。

下面是适配器设计模式实现的测试程序。

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

⬅返回目录

发表评论

电子邮件地址不会被公开。 必填项已用*标注