Adapter (Entwurfsmuster)
Der Adapter (engl. Adapter, Wrapper) ist ein Entwurfsmuster aus dem Bereich der Softwareentwicklung und gehört zu der Kategorie der Strukturmuster (Structural Patterns). Das Muster übersetzt eine Schnittstelle in eine andere. Dadurch können Klassen miteinander kommunizieren, die zueinander inkompatible Schnittstellen zur Verfügung stellen. Es ist eines der sogenannten GoF-Muster (siehe Viererbande).
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. Desweiteren 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:
- Adapter mit Delegation (Objektadapter)
- 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, daß der Adapter und der dahinterliegende Dienst ausgetauscht werden kann; dafür muß die gesamte genutzte Schnittstelle implementiert werden, auch wenn nur ein Teil der Schnittstelle angepasst werden soll.
Adapter mit Vererbung (Klassenadapter)
Hierbei bildet der Adapter eine Unterklasse der zu adaptierenden Klasse und erbt damit die entsprechenden Methoden. Damit erfolgt der Aufruf durch Selbstdelegation.
Dieser Adapter wird dann eingesetzt, wenn ein Teil einer ganz konkreten Schnittstelle variiert werden soll.
Vorteile
- Ein Klassenadapter passt genau eine Zielklasse an.
- Ein Klassenadapter kann dadurch das Verhalten der Zielklasse überschreiben.
- Ein Objektadapter kann auch Unterklassen mitanpassen.
Nachteile
- Ein Klassenadapter kann nicht zur automatischen Anpassung von Unterklassen verwendet werden.
- Klassenadapter lassen sich nur realisieren, wenn die Programmiersprache Schnittstellen oder Mehrfachvererbung unterstützt.
Akteure
- Dienst
- bietet wiederzuverwendende Dienstleistungen mit fest definierter Schnittstelle an
- Klient
- nutzt Dienste über inkompatible Schnittstelle
- greift dabei auf adaptierte Schnittstelle zurück
- Ziel
- definiert die Schnittstelle, die der Klient nutzen kann
- 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 von u.a. Visualworks Smalltalk intensiv genutzt.
Verwandte Entwurfsmuster
Ein Adapter ist der Brücke ähnlich. Jedoch ist die Brücke eine gezielte Designentscheidung zur Trennung einer Schnittstelle von ihrer Implementation, während der Adapter einer nachträglichen Anpassung einer Schnittstelle an eine andere dient. Ein Adapter ist wie die Fassade 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.