Patron de conception Adaptateur en Java
Le modèle de conception Adaptateur est l'un des modèles de conception structurels et il est utilisé afin que deux interfaces sans rapport puissent fonctionner ensemble. L'objet qui relie ces interfaces sans rapport est appelé un Adaptateur.
Patron de conception Adaptateur
Un des grands exemples réels du modèle de conception Adapter est le chargeur de téléphone portable. La batterie du téléphone 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 fonctionne comme un adaptateur entre la prise de charge du mobile et la prise murale. Nous allons essayer de mettre en œuvre un multi-adaptateur en utilisant le modèle de conception Adapter dans ce tutoriel. Donc, tout d'abord, nous aurons deux classes - Volt (pour mesurer les volts) et Socket (produisant des volts constants 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. Donc, 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();
}Motif d'adaptateur bidirectionnel
Lors de la mise en œuvre du patron Adapter, il existe deux approches - l'adaptateur de classe et l'adaptateur d'objet - cependant, ces deux approches produisent le même résultat.
- Adaptateur de classe - Cette forme utilise l'héritage Java et étend l'interface source, dans notre cas la classe Socket.
- Adaptateur d'Objet - Ce type utilise la composition Java et l'adaptateur contient l'objet source.
Patron de conception Adaptateur - Adaptateur de classe
Voici l'implémentation de notre adaptateur selon l'approche adaptateur de classe.
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);
}
}Patron de conception Adapter - Implémentation d'adaptateur d'objet
Voici l'implémentation adaptateur d'objet de notre adaptateur.
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);
}
}Remarquez 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 utiliser notre implémentation du modèle de conception 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=120Diagramme de classes du modèle de conception Adaptateur
Exemple de modèle de conception Adaptateur dans JDK
Certains exemples de modèles de conception d'adaptateur que je pourrais facilement trouver dans les classes JDK sont ;
- java.util.Arrays#asList()
- java.io.InputStreamReader(InputStream) (retourne un Reader)
- java.io.OutputStreamWriter(OutputStream) (retourne un Writer)
C'est tout pour le modèle de conception adaptateur en Java.


