Decorator

Entwurfsmuster in der Softwareentwicklung
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 16. Juni 2006 um 14:33 Uhr durch Srittau (Diskussion | Beiträge). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Der Dekorierer (engl. Decorator Pattern) ist ein Entwurfsmuster aus dem Bereich der Softwareentwicklung und gehört zur Kategorie der Strukturmuster (Structural Patterns). Das Muster ist eine flexible Alternative zur Unterklassenbildung, um die Funktionalität einer Klasse zu erweitern. Es ist eines der sogenannten GoF-Muster (siehe Viererbande).

Verwendung

Die Instanz eines Dekorierers wird vor die zu dekorierende Klasse geschaltet. Der Dekorierer hat die gleiche Schnittstelle wie die zu dekorierende Klasse. Aufrufe an den Dekorierer werden dann verändert oder unverändert weitergeleitet (Delegation), oder sie werden komplett in Eigenregie verarbeitet. Der Dekorierer ist dabei "unsichtbar", da der Aufrufende gar nicht mitbekommt, dass ein Dekorierer vorgeschaltet ist.

In einer alternativen Variante kann der Dekorierer als eine Strategie eingebunden und explizit aufgerufen werden.

UML-Diagramm

... Datei:Deco.png

Akteure

  • Konkrete Komponente
  • Konkreter Dekorierer

Vorteile

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

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.

Beispiele

Beispiel 1:

  • Ein Textfeld soll mit einer Umrahmung "dekoriert" werden.
  • Zwischen den Aufrufer und das Textfeldobjekt wird das entsprechende Dekoriererobjekt eingefügt.
  • Das Dekoriererobjekt erzeugt die Umrahmung und übergibt den Kontrollfluss an das Textfeld.
  • Da der Dekorierer dieselbe Schnittstelle hat, ändert sich aus der Sicht des Aufrufers nichts.

Beispiel 2:

  • Jede Komponente stellt sich ab dem Ursprungspunkt 0x0 dar; dies ist die eigentliche, zu dekorierende Klasse.
  • 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 Spezialisierung erweitert den Darstellungsaufruf um einen darumliegenden Rahmen.
  • Ein zusätzlicher Dekorierer, der den ersten Dekorierer nochmals dekoriert, kann die Komponente unsichtbar oder abgeschaltet werden lassen, indem Darstellungs- und Mausabfrage-Methoden wahlweise abgeblockt werden.

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

Verwandte Muster

  • Strategie: Im Vergleich zum Dekorierer, welcher die tatsächlich zu verwendete Klasse selbst wählt, muss bei dem Strategie-Muster die aufrufende Instanz explizit wissen, welche Varianten zur Verfügung stehen und welche daraus verwendet werden soll.
  • Composite