„Hallo Amigo! Heute werde ich dir erzählen, was genau ein „Adapter“ ist. Ich hoffe, dass du danach ein wesentlich besseres Verständnis der Eingabe-/Ausgabedatenströme haben wirst.“

Adapter - 1

Stelle dir vor, dein Programm verwendet zwei Frameworks, die von anderen Programmierern/Unternehmen geschrieben wurden. Beide Frameworks sind sehr gut und verwenden OOP-Prinzipien: Abstraktion, Polymorphismus, Kapselung. Kombiniert decken sie fast vollständig all das ab, was dein Programm tun soll. Du stehst also vor einer einfachen Aufgabe. Du musst Objekte, die von einem Framework erstellt wurden, an das andere Framework weitergeben. Aber beide Frameworks sind völlig unterschiedlich und „wissen nichts voneinander“, d.h. sie haben keine gemeinsamen Klassen. Du musst die Objekte des einen Frameworks irgendwie in Objekte des anderen Frameworks umwandeln.

Diese Aufgabe kann durch die Anwendung der „Adapter“-Technik (Entwurfsmuster) sehr elegant erledigt werden:

Java-Code Beschreibung
class MyClass implements Interface2
{
 private Interface1 object;
 MyClass(Interface1 object)
 {
  this.object = object;
 }
// This is where we put the Interface2 methods 
// that call Interface1 methods
}
Das spiegelt das Entwurfsmuster des Adapters wider.

Die Grundidee ist, dass die MyClass-Klasse ein Interface in das andere umwandelt (adaptiert).

„Kannst du mir ein konkreteres Beispiel nennen?“

„OK. Nehmen wir an, jedes Framework hat sein eigenes, einzigartiges „Listen“-Interface. Die könnten etwa so aussehen:“

Java-Code Beschreibung
interface AlphaList
{
 void add(int value);
 void insert(int index, int value);
 int get(int index);
 void set(int index, int value);
 int count();
 void remove(int index);
}
Code aus dem ersten Framework (Alpha).

AlphaList ist eines der Interfaces, das die Interaktion zwischen dem Framework-Code und dem Code, der das Framework verwendet, ermöglicht.

class AlphaListManager
{
 public static AlphaList createList()
 {
  //some code to create an object
 }
}
AlphaListManager AlphaListManager ist eine Klasse im Framework. Ihre createList-Methode erstellt ein AlphaList-Objekt
interface BetaList
{
 int getValue(int index);
 void setValue(int index, int value);
 int getSize();
 void setSize(int newSize);
}
class BetaSaveManager
{
 public static void saveList(BetaList list)
 {
  //some code to save a BetaList object
  //to a file on disk
 }
}
Code aus dem zweiten Framework (Beta).

BetaList ist eines der Interfaces, das die Interaktion zwischen dem Framework-Code und dem Code, der das Framework verwendet, ermöglicht.

BetaSaveManager ist eine Klasse im Framework. Ihre saveList-Methode speichert ein BetaList-Objekt.

class ListAdapter implements BetaList
{
 private AlphaList list;
 ListAdapter(AlphaList list)
 {
  this.list = list;
 }

 int getValue(int index)
 {
  return this.list.get(index);
 }

 void setValue(int index, int value)
 {
  this.list.set(index, value);
 }

 int getSize()
 {
  return this.list.count();
 }

 void setSize(int newSize)
 {
  if (newSize > this.list.count()
  {
   while (this.list.count() < newSize)
  {
   this.list.add(null);
  }
 }
 else if (newSize < this.list.count() {
   while (this.list.count() > newSize)
   {
    list.remove(list.count() - 1);
   }
  }
 }
}
„Adapter“-Klasse, die vom AlphaList-Interface zum BetaList-Interface umwandelt.

Die ListAdapter-Klasse implementiert das BetaList-Interface aus dem zweiten Framework.

Wenn jemand diese Methoden aufruft, „leitet“ der Klassencode die Aufrufe an die list-Variable weiter, die eine AlphaList aus dem ersten Framework ist.

Ein AlphaList-Objekt wird an den ListAdapter-Konstruktor übergeben.

Die setSize-Methode funktioniert nach folgenden Regeln: Wenn die Größe der Liste erhöht werden muss, füge leere (null) Elemente hinzu. Wenn die Liste verkleinert werden muss, lösche die Einträge am Ende.

public static void main(String[] args)
{
 AlphaList listAlpha = AlphaListManager.createList();
 BetaList listBeta = new ListAdapter(listAlpha);
 BetaSaveManager.saveList(listBeta);
}
So könnte das verwendet werden.

„Dein letztes Beispiel hat mir am besten gefallen. Sehr prägnant und verständlich.“