Java Standard: Muster Adapter

Erlaeuterungen Bearbeiten

Beschreibung des Szenarios Bearbeiten

Als Szenario sei angenommen, dass eine Firma namens "fremde_Firma" in einem gleichnamigen Paket Funktionalität bereitstellt (eine Methode zur Ausgabe einer Liste von Strings), die wir in unserem Projekt verwenden wollen. Leider passen sich die Namensgebung und auch der erwartete Typ des Parameters nicht in unser Programmschema ein.

Wir wollen das Adapter-Muster verwenden, um unserem Programm dennoch eine Möglichkeit zum unkomplizierten Zugriff auf diese externe Funktionalität zu geben: Das Interface ListenAnsicht definiert die Schnittstelle und die Klasse ListenAnsichtAdapter leitet Aufrufe an die externe Klasse weiter - nachdem eine Konvertierung des Parameters vorgenommen wurde.

Der Code am Ende dieser Seite setzt das Beispiel um (man stelle sich vor, dass kein Zugriff auf den fremden Code möglich ist und stelle_liste_dar() etwas furchtbar Kompliziertes tut).

Anmerkungen zum realen Einsatz Bearbeiten

Mag das Beispiel auch konstruiert wirken - der Nutzen eines Adapter ist sehr real: Beispielsweise erzeugen Generatoren aus einer IDL-Definition häufig recht komplizierten Code (teilweise mit eigenen Typen, die primitive Typen wie int kapseln, oder der Notwendigkeit Aufrufe von entfernten Prozeduren in try-catch-Blöcke zu setzen) - der Autor zieht es in solchen Fällen vor noch einen Adapter bereitzustellen, der sich um diese Details kümmert, so dass das restliche Programm es nicht muss.

Allerdings verleitet der Adapter auch zu "Missbrauch": Steht der Quellcode der externen Funktionalität zur Verfuegung, so sollte überlegt werden, ob nicht einem Refactoring der Vorzug zu geben wäre - dies hält die Architektur übersichtlicher.

Code Bearbeiten

 package fremde_Firma.bibliothek;
 
 class Externe_Listen_Ansicht {
   public void stelle_liste_dar(String[] liste) {
     for (int i = 0; i < liste.length; i++)
       System.out.println(liste[i]);
   }
 }
 package meineFirma.produkt;
 
 import java.util.Collection;
 import java.util.ArrayList;
 
 interface ListenAnsicht {
   public void zeigeListe(Collection<String> liste);
 }
 
 class ListenAnsichtAdapter implements ListenAnsicht {
   fremde_firma.bibliothek.Externe_Listen_Ansicht extern;
 
   public ListenAnsichtAdapter() {
     this.extern = new fremde_firma.bibliothek.Externe_Listen_Ansicht();
   }
 
   public void zeigeListe(Collection<String> liste) {
     String[] strListe = liste.toArray(new String[0]);
     this.extern.stelle_liste_dar(strListe);
   }
 }
 
 public class AdapterTest {
   public static void main(String[] args) {
     ListenAnsicht la = new ListenAnsichtAdapter();
 
     ArrayList<String> liste = new ArrayList<String>();
 
     liste.add("Hallo");
     liste.add("Welt");
 
     la.zeigeListe(liste);
   }
 }