Modèle de conception d’adaptateur en Java

Le modèle de conception de l’adaptateur est l’un des modèles de conception structurels et il est utilisé afin que deux interfaces non liées puissent fonctionner ensemble. L’objet qui relie ces interfaces non liées est appelé un Adaptateur.

Modèle de conception de l’adaptateur

L’un des excellents exemples concrets du modèle de conception de l’adaptateur est le chargeur de téléphone portable. La batterie du téléphone portable a besoin de 3 volts pour se charger, mais la prise normale produit soit 120V (États-Unis) soit 240V (Inde). Ainsi, le chargeur de téléphone portable agit comme un adaptateur entre la prise de charge du téléphone portable et la prise murale. Nous allons essayer de mettre en œuvre un adaptateur multiple en utilisant le modèle de conception de l’adaptateur dans ce tutoriel. Tout d’abord, nous aurons deux classes – Volt (pour mesurer les volts) et Socket (produisant une tension constante de 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);
	}
}

Maintenant, nous voulons construire un adaptateur qui peut produire 3 volts, 12 volts et par défaut 120 volts. Tout d’abord, nous allons créer une interface d’adaptateur avec ces méthodes.

package com.journaldev.design.adapter;

public interface SocketAdapter {

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

Modèle de conception d’adaptateur bidirectionnel

Pendant la mise en œuvre du modèle d’adaptateur, il existe deux approches – l’adaptateur de classe et l’adaptateur d’objet – cependant, ces deux approches produisent le même résultat.

  1. Adaptateur de classe – Cette forme utilise l’héritage Java et étend l’interface source, dans notre cas la classe Socket.
  2. Adaptateur d’objet – Cette forme utilise la composition Java et l’adaptateur contient l’objet source.

Modèle de conception d’adaptateur – Adaptateur de classe

Voici l’implémentation de l’approche adaptateur de classe de notre adaptateur.

package com.journaldev.design.adapter;

// Utilisation de l'héritage pour le modèle d'adaptateur
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);
	}

}

Modèle de conception d’adaptateur – Implémentation de l’adaptateur d’objet

Voici l’implémentation de l’approche adaptateur d’objet de notre adaptateur.

package com.journaldev.design.adapter;

public class SocketObjectAdapterImpl implements SocketAdapter{

	// Utilisation de la composition pour le modèle d'adaptateur
	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);
	}
}

Notez que les deux implémentations de l’adaptateur sont presque identiques et qu’elles implémentent l’interface SocketAdapter. L’interface de l’adaptateur peut également être une classe abstraite. Voici un programme de test pour consommer notre implémentation du modèle de conception de l’adaptateur.

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

Lorsque nous exécutons le programme de test ci-dessus, nous obtenons la sortie suivante.

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

Diagramme de classe du modèle de conception de l’adaptateur

Exemple de modèle de conception d’adaptateur dans JDK

Certains exemples du modèle de conception d’adaptateur que j’ai pu facilement trouver dans les classes JDK sont :

  • java.util.Arrays#asList()
  • java.io.InputStreamReader(InputStream) (renvoie un Reader)
  • java.io.OutputStreamWriter(OutputStream) (renvoie un Writer)

C’est tout pour le modèle de conception d’adaptateur en java.

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