Autoboxing

Der Adapter (englisch Adapter, Wrapper) ist ein Entwurfsmuster aus dem Bereich der Softwareentwicklung und gehört zu der Kategorie der Strukturmuster (Structural Patterns). Das Muster dient zur Übersetzung einer Schnittstelle in eine andere. Dadurch wird die Kommunikation von Klassen mit zueinander inkompatiblen Schnittstellen ermöglicht. Es ist ein Entwurfsmuster der sogenannten GoF-Muster (Gang of Four, siehe Viererbande).

Inhaltsverzeichnis

Verwendung

Der Adapter findet Anwendung, wenn eine existierende Klasse verwendet werden soll, deren Schnittstelle nicht der benötigten Schnittstelle entspricht. Dies tritt insbesondere dann auf, wenn Klassen, die zur Wiederverwendung konzipiert wurden, z. B. Werkzeugsammlungen oder Klassenbibliotheken, verwendet werden sollen. Diese stellen ihre Dienste durch klar definierte Schnittstellen zur Verfügung, die in der Regel nicht geändert werden sollen und häufig auch nicht geändert werden können, da sie von Dritten stammen. Des Weiteren wird der Adapter bei der Erstellung wiederverwendbarer Klassen benutzt, wenn diese mit unabhängigen oder nichtvorhersehbaren Klassen zusammenarbeiten sollen.

UML-Diagramm

Die „Gang of Four“ (Viererbande) beschreibt zwei Realisierungsalternativen. Die erste ist der Adapter mit Delegation (der sogenannte Objektadapter), die zweite der Adapter mit Vererbung (Klassenadapter).

Adapter mit Delegation (Objektadapter)

Hierbei hat der Adapter eine Assoziation zu der zu adaptierenden Klasse und leitet die Anfragen per Delegation weiter.

Der Vorteil ist, dass der Adapter und der dahinterliegende Dienst ausgetauscht werden können; dafür muss die gesamte genutzte Schnittstelle implementiert werden, auch wenn nur ein Teil der Schnittstelle angepasst werden soll.

Objektadapter (UML2.0)

Objektadapter sind auch als Hüllenklasse oder Wrapper Class bekannt. Dabei können nicht nur andere Klassen gekapselt werden, sondern auch primitive Datentypen oder prozedurale Programmierbibliotheken.

Hüllenklassen für primitive Datentypen

Eine Anwendung für Hüllenklassen in objektorientierten Programmiersprachen ist, Klassen für Grunddatentypen zur Verfügung zu stellen, um die Handhabung zu vereinfachen und zusätzliche Funktionen zur Verfügung zu stellen. So gibt es z. B. in der Programmiersprache Java für den Typ int die Klasse Integer, für char die Klasse Character oder für float die Klasse Float (entsprechend auch Short, Long, Boolean und Double). Diese Hüllenklassen ermöglichen den objektorientierten Umgang mit primitiven Datentypen, zum Beispiel, um sie in ein Reflexionskonzept einzubinden.

Um die Verwendung von Hüllenklassen zu vereinfachen, wurde in Java 5 das so genannte Autoboxing oder Boxing eingeführt. Diese Technik ermöglicht die Verwendung von Hüllenklassen in der von primitiven Datentypen gewohnten Form. Statt der Objekterzeugung mittels Integer i = new Integer(100) kann einfach die Schreibweise Integer i = 100 genutzt werden. Ebenfalls kann die Referenzvariable i genutzt werden, als wäre sie eine gewöhnliche int-Variable. Die einfache Schreibweise und bessere Lesbarkeit geht auf Kosten einer erheblich schlechteren Ausführungsgeschwindigkeit.

Hüllenklassen für prozedurale Bibliotheken

Eine weitere wichtige Anwendung ist die Anpassung einer prozeduralen Bibliothek an ein objektorientiertes Softwaresystem. Hierbei werden die funktionsorientierten Dienste der Bibliothek in ein oder mehrere Objekte gekapselt. Diese Anwendungsform ist häufig als Entwurfsmuster Fassade zu finden.

Adapter mit Vererbung (Klassenadapter)

Ein Klassenadapter wird mit Hilfe von Mehrfachvererbung realisiert. Zum Einen erbt er die Implementierung der zu adaptierenden Klasse. Zum Anderen die zu Implementierende Schnittstelle. Der Aufruf erfolgt dann durch Selbstdelegation.

Ein Klassenadapter kann dann sinnvoll eingesetzt werden, wenn die Programmiersprache (wie z.B. C++) die erforderlichen Sprachfeatures (Mehrfachvererbung, private Vererbung) unterstützt. Java ist für diese Art von Adapter eher ungeeignet, da weder private noch Mehrfachvererbung zum Sprachumfang gehören. Der Versuch diese Beschränkung über die Kombination von Klassenvererbung und Interface-Implementierung zu umgehen führt dazu, dass die Adapterklasse ihren Klienten alle Methoden zur Verfügung stellt. Das Konstrukt kann zwar als Adapter verwendet werden, ist aber kein Adapter im Sinne des GoF-Buchs, welcher eine Schnittstelle in eine Andere überführt.

Klassenadapter (UML2.0)

Beispiel - Klassenadapter

// C++ Code Beispiel
 
/* Die Schnittstelle, welche der Adapter implementieren soll */
class UsedInterface {
public:
  UsedInterface();
  virtual void operation() const;
};
 
/* Die Implementierung, welche der Adapter verwenden soll */
class Adaptee {
public:
  Adaptee();
  void adaptedOperation() const;
};
 
/* Die eigentliche Adapterklasse */
class Adapter : public UsedInterface, private Adaptee {
public:
  Adapter();
  virtual void operation() const;
};
 
/* Implementierung des Adapters */
void Adapter::operation() const {
  Adaptee::adaptedOperation();
}

Vor- und Nachteile

Die Vorteile eines Klassenadapters bestehen darin, dass er sich genau einer Zielklasse anpasst und dadurch das Verhalten der Zielklasse überschreiben kann. Der Objektadapter kann auch Unterklassen mit anpassen.

Nachteilig wirkt sich aus, dass ein Klassenadapter nicht zur automatischen Anpassung von Unterklassen verwendet werden kann.

Akteure

Der Dienst bietet wiederzuverwendende Dienstleistungen mit fest definierter Schnittstelle an. Der Klient nutzt Dienste über inkompatible Schnittstelle und greift dabei auf adaptierte Schnittstelle zurück. Das Ziel definiert die Schnittstelle, die der Klient nutzen kann. Der Adapter adaptiert die Schnittstelle des Dienstes auf die Schnittstelle zum Klienten.

Beispiel

Der Zugriff der Elemente einer grafischen Benutzeroberfläche auf das dahinterliegende Modell kann über Adapter mit Delegation gesteuert werden. So kann z. B. eine Checkbox sowohl einen gepufferten Boolean-Wert als auch das unmittelbare Ergebnis einer Bedingung anzeigen. Dieses Muster wird u. a. von Visualworks Smalltalk intensiv genutzt.

Verwandte Entwurfsmuster

Brücke und Adapter sind sich ähnlich. Die Brücke ist jedoch eine gezielte Designentscheidung zur Trennung einer Schnittstelle von ihrer Implementation, während der Adapter einer nachträglichen Anpassung einer Schnittstelle an eine andere dient.

Fassade und Adapter sind eine Form der Hüllenklasse. Die Fassade verbirgt allerdings den Funktionsumfang einer Bibliothek ganz oder teilweise, während der Adapter nur die Schnittstelle verändert.


Wikimedia Foundation.

Schlagen Sie auch in anderen Wörterbüchern nach:

  • autoboxing — noun Automatic boxing (mapping primitive data items to complex objects) …   Wiktionary

  • Object type — In computer science, an object type (a.k.a. wrapping object) is a datatype which is used in object oriented programming to wrap a non object type to make it look like a dynamic object.Some object oriented programming languages make a distinction… …   Wikipedia

  • Object type (object-oriented programming) — See also: Object (computer science) In computer science, an object type (a.k.a. wrapping object) is a datatype which is used in object oriented programming to wrap a non object type to make it look like a dynamic object.[citation needed] Some… …   Wikipedia

  • Generische Programmierung in Java 5.0 — Generische Programmierung wird in Java durch so genannte Generics ermöglicht. Der Begriff steht synonym für „parametrisierte Typen“. Die Idee dahinter ist zusätzliche Variablen für Typen, sog. Typ Variablen, einzuführen. Diese repräsentieren zum… …   Deutsch Wikipedia

  • Java (Programmiersprache) — Java Basisdaten Paradigmen: Objektorientierte Programmiersprache Erscheinungsjahr …   Deutsch Wikipedia

  • Syntax von C-Sharp — Dieser Artikel bietet eine Übersicht einiger Sprachelemente von C#. Inhaltsverzeichnis 1 Bedingte Ausführung (if, else, switch) 2 Schleifen (for, do, while, foreach) 3 Die Sprungbefehle break, continue, goto und return 4 Die using Anweisung …   Deutsch Wikipedia

  • Generische Programmierung in Java — wird durch sog. Generics ermöglicht. Der Begriff steht synonym für „parametrisierte Typen“. Die Idee dahinter ist, zusätzliche Variablen für Typen einzuführen. Diese Typ Variablen repräsentieren zum Zeitpunkt der Implementierung unbekannte Typen …   Deutsch Wikipedia

  • Sprachelemente von C-Sharp — Dieser Artikel bietet eine Übersicht einiger Sprachelemente von C#. Inhaltsverzeichnis 1 Bedingte Ausführung (if, else, switch) 2 Schleifen (for, do, while, foreach) 3 Die Sprunganweisungen break, c …   Deutsch Wikipedia

  • Java (informatique) — Java (langage) Pour les articles homonymes, voir Java.  Ne doit pas être confondu avec JavaScript …   Wikipédia en Français

  • Java (langage) — Pour les articles homonymes, voir Java.  Ne doit pas être confondu avec JavaScript. Java …   Wikipédia en Français

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”