Zum Inhalt springen

Decorator

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 9. Juli 2004 um 16:14 Uhr durch Kuli (Diskussion | Beiträge) (Schreibfehler). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Das Decorator Pattern ist ein Entwurfsmuster, welches eine Klasse kapselt, so daß diese durch weitere oder abgeänderte Funktionen "dekoriert" wird. Dazu gibt es zwei Möglichkeiten der Umsetzung:

  1. Der Dekorierer wird als eine Strategie eingebunden und explizit aufgerufen. Ein Beispiel ist eine Klasse, die einen Rahmen um eine Komponente herum zeichnet.
  2. Die Instanz eines Dekorierers wird vor die zu dekorierende Klasse geschaltet (englische Bezeichnung: Wrapper). Der Dekorierer sollte dazu die gleiche Schnittstelle wie die zu dekorierende Klasse implementieren. Aufrufe an den Dekorierer werden dann verändert oder unverändert weitergeleitet (Delegation), oder sie werden komplett in Eigenregie verarbeitet. Der Dekorierer kann sich dabei völlig "unsichtbar" verhalten, indem der Aufrufende gar nicht mitbekommt, daß ein Dekorierer vorgeschaltet ist, oder er kann die Schnittstelle des Dekorierenden noch erweitern.


Im folgenden wird nur der 2. Fall beschrieben.

Die Implementierung, die klassisch für die Delegation ist, steht im Kontrast zur Vererbung, bei der die zu verändernde/erweiternde Klasse direkt beerbt wird. Die Vorteile gegenüber der Vererbung sind:

  • Es können mehrere Dekorierer hintereinandergeschaltet werden
  • Die zu dekorierende Klasse ist nicht unbedingt festgelegt (wohl aber dessen Schnittstelle)
  • Die Dekorierer können zur Laufzeit und sogar nach der Instantiierung ausgetauscht werden
  • Lange, unübersichtliche Vererbungshierarchien werden vermieden.

Es gibt aber auch Nachteile:

  • Eventuell müssen viele Methoden implementiert werden, die die Aufrufe lediglich weiterleiten.
  • Erweiterungen der zu dekorierenden Klasse werden unabsichtlich versteckt. Manchmal behilft man sich mit einem Broadcast-Mechanismus.
  • Der Aufbau der Dekorierer-Instanzen wird komplexer. Als Hilfe kann dazu das Entwurfsmuster des Erbauer dienen.

Ein Beispiel des Wechsel einer komplexen Vererbungshierarchie zu Dekorieren bietet die Firma Parcplace mit der Smalltalk-Implementierung VisualWorks. Dort wurden die GUI-Komponenten in verschiedene Wrapper-Klassen "auseinandergebrochen".


Beispiel: Jede Komponente stellt sich ab dem Ursprungspunkt 0x0 dar.

Ein vorgeschalteter Dekorierer kann die Position verschieben, indem Darstellungs- und Mauskoordinaten-Aufrufe verändert werden.

Eine Spezialisierung davon ist ein Dekorierer, der zusätzlich eine feste Größe definiert, außerhalb derer nichts dargestellt werden kann.

Eine weitere Spezialiserung erweitert den Darstellungsaufruf um einen darumliegenden Rahmen. Ein zusätzlicher Dekorierer kann die Komponente unsichtbar oder abgeschaltet werden lassen, indem Darstellungs- und Mausabfrage-Methoden wahlweise abgeblockt werden.


An diesem Beispiel sieht man auch, daß sich Vererbung und Delegation nicht ausschließen.