Für alle denen beim Lesen des Titels nichts dazu eingefallen ist, es geht in diesem Artikel um Entwurfsmuster, genauer um die Strukturmuster Decorator, Adapter und Proxy.
Häufig kommt es vor, dass diese drei Muster aufgrund gewisser oberflächlicher Ähnlichkeiten verwechselt oder pauschal zum Decorator gemacht werden.
Dabei verfolgen alle drei doch recht unterschiedliche Ziele und die will ich heute möglichst kurz gegenüberstellen.
Zunächst klären wir erstmal was die drei gemeinsam haben. Alle drei Muster kontrollieren den Zugriff auf ein Objekt.
Decorator
Das wichtigste Merkmal eines Decorators ist, dass er den Typ des zu dekorierenden Objektes nicht verändert. Wollen wir also ein Animalobjekt dekorieren, dann muss unser Dekorierer von Animal erben und alle Methodenaufrufe an das in ihm gekapselte Objekt delegieren.
Beim Weiterleiten der Methodenaufrufe kann nun das Verhalten verändert werden und das ohne Vererbung zur Laufzeit.
Methoden können quasi abgeschaltet werden, indem sie nicht weiterleiten. Andere Methoden könnten die Werte vor dem Weiterleiten verändern. Auch neue, zusätzliche Methoden sind möglich.
Beispiele
- Streams (in Java)
- Verändern von GUI-Elementen
Adapter
Im Gegensatz zum Decorator verändert der Adapter gewollt den Typ des gekapselten Objektes. Das Muster eignet sich, um bestehende Komponenten an eine neue Schnittstelle anzupassen.
Wenn sich die Katze also wie eine Kuh verhalten soll…
class CatToCowAdapter extends Cow { private Cat cat; // andere Methoden public void muh() { this.cat.miau(); } }
Proxy
Ein Proxy ist ein Stellvertreter für die “echten” Objekte, wenn diese zum Beispiel nicht sofort verfügbar sind oder nicht alle Ressourcen freigeben dürfen. Soll zum Beispiel ein Bild in einer GUI-Anwendung über das Netzwerk geladen werden, würde das ggf. die Anwendung während der Ladezeit ausbremsen.
Ein ImageProxy könnte in einem eigenen Thread auf das Bild warten und in der Zwischenzeit eine Ersatzgrafik anzeigen (animierte Sanduhr etc.).
Über Proxy-Objekte lässt sich auch der Zugriff auf Datenstrukturen kontrollieren. Dabei würde der Proxy kontrollieren, wem das Datenobjekt gehört und nur die dementsprechenden Lese- und Schreibzugriffe erlauben.
Beispiele
- Laden von Ressourcen
- Kontrollieren von Daten