结构设计模式 - 适配器设计模式

194 篇文章 3 订阅
23 篇文章 7 订阅

 

结构设计模式 - 适配器设计模式

 

适配器设计模式是结构设计模式之一,其使用使得两个不相关的接口可以一起工作。连接这些不相关接口的对象称为适配器。

 

 

目录

1 适配器设计模式
1.1 双向适配器模式
1.2 适配器设计模式 - 类适配器
1.3 适配器设计模式 - 对象适配器实现
1.4 适配器设计模式类图
1.5 JDK 中的适配器设计模式示例

适配器设计模式

适配器设计模式,java 中的适配器设计模式,适配器模式,适配器模式 java 示例
适配器设计模式的一个重要现实例子是移动充电器。移动电池需要 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

适配器设计模式类图

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

JDK 中的适配器设计模式示例
我可以在 JDK 类中轻松找到的一些适配器设计模式示例;

java.util.Arrays 中#asList()
java.io.InputStreamReader(InputStream)(返回一个 Reader)
java.io.OutputStreamWriter(OutputStream)(返回一个 Writer)
这就是 java 中适配器设计模式的全部内容。

转载来源:https://www.journaldev.com/1487/adapter-design-pattern-java

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值