Twitter und Facebook-Anbindung
X
Tweet Follow @twitterapi
!!! Anbindung an twitter und facebook öffnen !!!

Wenn Ihnen mein Online-Buch gefällt,
dann bedanken Sie sich doch mit einer kleinen Spende...

34.1 Adapter und Facade

34.1 Adapter und Facade

Diese zwei Entwurfsmuster dienen der Kapselung von Schnittstellen und kommen immer dann zum Einsatz, wenn man eine vorgefertigte fremde Schnittstelle hat, welche man nicht so ansprechen will oder kann, wie es einem vorgegeben wird. Im Volksmunde ist hier oft die Rede von Wrappern, also Hüllen oder Verpackungen. Wie der Name schon suggeriert, mappt man mit diesen Klassen eigene Aufrufe auf ganz andere. Die eigene Anwendung stellt hier wieder den Client dar, während die Schnittstelle bzw. die fremde Bibliothek der Dienst ist, der angesprochen werden soll.

Stellen Sie sich vor, sie wollten tatsächlich ein Spiel programmieren und dabei DirectrX benutzen. Nun haben Sie sich aber für die Datenhaltung ganz andere Datenstrukturen konstruiert. DirectX verlangt aber ständig eigene Datentypen. An dieser Stelle haben Sie zwei Möglichkeiten. Entweder Sie passen Ihre gesamte Anwendung an und nehmen immer vor den Aufrufen entsprechende Umwandlungen vor oder Sie bauen einen Adapter, welcher Ihre Objekte in andere umwandelt und die gewünschte Methode aufruft. Letztere Variante hat den Vorteil, dass diese Umwandlungen nicht so tief in Ihrer Applikation verwurzelt sind und somit leichter auf Änderungen von DirectX reagiert werden kann. Zudem gibt es eine zentrale Stelle für die Umwandlungen.

Nun unterteilt man die Adapter in zwei verschiedene Kategorien, nämlich die Objektadapter und die Klassenadapter.

Vereinfachte Struktur des Adapter Pattern

Objektadapter Implementieren ein Zielinterface und komponieren den Dienst. Intern wird dann der Zugriff auf das Zielinterface so implementiert, dass das Interface des Dienstes benutzt wird. Klassenadapter sind in vielen Programmiersprachen nicht möglich, wohl aber in C++, da diese Sprache Mehrfachvererbung erlaubt. Der Unterschied ist, dass der Klassenadapter nicht die eigentliche Schnittstelle preisgibt (da privat geerbt wird) und auch nicht alle Methoden implementieren muss.

Adapter benutzt man um s.g. Hüllenklassen zu entwerfen, welche sich wiederum in zwei Untergruppen teilen lassen. Das eine mal verpackt man Primitivtypen und das andere mal verpackt man Bibliotheken bzw. mehrere Funktionen, welche nicht durch eine Klasse gekapselt werden. In diesem Fall spricht man von einer Facade.

Vereinfachte Struktur des Facade Pattern

Ein Verwendungszweck für eine Hüllenklasse wäre die Klasse "CString", welche den Primitivtyp "char" verpackt. So könnte sich der String gleich intern merken wie groß bzw. lang er ist und wenn diese Klasse dann noch zusätzliche Operatoren für die Addition oder für Vergleiche bereitstellt, wird die Verwendung von Strings in C++ wesentlich angenehmer. Ich habe an dieser Stelle auf ein Beispiel mit Quelltext verzichtet, da man eine solche Klasse in den Standardbibliotheken findet. Auch in Java sind solche Hüllenklassen üblich. Beispielsweiße wird der Primitivtyp "int", durch die Klasse "Integer" gekapselt.

Ein Beispiel für eine Facade wäre meine Threadwrapperklasse, welche ich Ihnen bereits vorgestellt hatte. Hier kapsle ich die Funktionen der WinAPI und bringe sie in einen gemeinsamen Kontext, um das Arbeiten mit Threads zu erleichtern bzw. ergonomischer zu gestalten.

Zum Seitenanfang
Zum Inhaltsverzeichnis

© Copyright by Thomas Weiß, 2009 - 2012