Java中的適配器設計模式

適配器設計模式是結構性設計模式之一,用於使兩個不相關的接口能夠一起工作。將這兩個不相關的接口結合在一起的對象稱為適配器

適配器設計模式

適配器設計模式的一個很好的現實例子是手機充電器。手機電池需要3伏特才能充電,但普通插座提供的電壓為120伏特(美國)或240伏特(印度)。因此,手機充電器充當手機充電插座和牆插之間的適配器。在本教程中,我們將嘗試使用適配器設計模式來實現多適配器。首先,我們將創建兩個類 – Volt(用於測量伏特)和Socket(產生固定的120伏特電壓)。

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

雙向適配器模式

在實施適配器模式時,有兩種方法 – 類適配器和對象適配器 – 然而這兩種方法都會產生相同的結果。

  1. 類適配器 – 這種形式使用Java繼承,並擴展源接口,在我們的情況下是Socket類。
  2. 對象適配器 – 這種形式使用Java組合,適配器包含源對象。

適配器設計模式 – 類適配器

這是我們適配器的類適配器方法的實現。

package com.journaldev.design.adapter;

// 使用繼承進行適配器模式
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.journaldev.design.adapter;

public class SocketObjectAdapterImpl implements SocketAdapter{

	// 使用組合進行適配器模式
	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中的適配器設計模式的全部。

Source:
https://www.digitalocean.com/community/tutorials/adapter-design-pattern-java