Zweck:
Erweitere ein Objekt dynamisch um
Zuständigkeiten. Dekorierer bieten ein flexible Alternative zur
Unterklassenbildung, um die Funktionalität einer Klasse zu erweitern.
Motivation:
Gelegentlich wollen wir die Funktionalität
einzelner Objekte erweitern, ohne ihre Klassen zu ändern. Eine Klassenbibliothek
sollte es Dir beispielsweise ermöglichen, zusätzliche Eigenschaften wie
Umrahmungen oder zusätzliche Funktionen wie Scrollen zu beliebigen Komponenten
einer Benutzungsschnittstelle hinzufügen zu können.
Vererbung ist eine Möglichkeit, die Funktionalität zu erweitern. Die Dekoration ist allerdings
statisch. Ein Klient kann nicht steuern wann und wie die Komponente zu
dekorieren ist.
Ein flexiblerer Ansatz besteht darin, die Komponente in einem
anderen Objekt einzuschließen, das z.B den Rahmen hinzufügt. Das einschließende
Objekt heißt Dekorierer.
Die Schnittstelle des Dekorierers entspricht der
Schnittstelle der dekorierten Komponente, so daß seine Anwesenheit für Klienten
transparent ist. Der Dekorierer leitet Operationsaufrufe an die Komponente
weiter und führt möglicherweise vor oder nach dem Weiterleiten zusätzliche
Operationen aus, wie z.B. das Zeichnen eines Rahmens. Diese Transparenz
ermöglicht es Dir, Dekorierer rekursiv zu schachteln. Somit kann beliebige
und mengenmäßig unbeschränkte Funktionalität hinzugefügt werden.
|
Abb. 1: Das Dekorierer Design Pattern
|
|