Klassifizierung |
objektbasiertes Strukturmuster
|
| |
Zweck |
Objekte dynamisch um Funktionalität erweitern
flexible Alternative zu Unterklassenbildung
|
| |
Alias |
decorator, wrapper
gebundener Umwickler
|
| |
Motivation |
|
| |
statischer Ansatz |
Klassenhierarchien erweitern
|
| |
|
Kombinierbarkeit bei statischem Ansatz nicht möglich
|
| |
|
Explosion der # der Klassen
|
| |
|
mangelnde Flexibilität:
nicht beliebig kombinierbar
z.B. keine Schachtelung von zwei frames (mit unterschiedlichen Farben)
|
| |
Anwendbarkeit |
|
|
zusätzliche Funktionalität dynamisch hinzufügen
|
|
zusätzliche Funktionalität transparent hinzufügen
|
|
Funktionalität kann wieder entfernt werden
|
|
anwendbar, wenn Unterklassenbildung nicht praktikabel ist
|
| |
Struktur |
Strukturdiagramm
|
| |
Teilnehmer |
|
Komponente |
abstrakt
einheitliche Schnittstelle
|
KonkreteKomponente |
konkret
Klasse für Objekte, die erweitert werden können
|
Dekorierer |
abstrakt
verwaltet Referenz auf Komponenten-Objekt
verhält sich wie das Objekt selbst
default-Funktionalität
--> Proxy
|
KonkreterDekorierer[A-B] |
fügen neue Funktionalität und/oder neue Datenkomponenten hinzu
|
| |
Konsequenzen |
|
|
flexibler als Vererbung
|
|
mehrfache Anwendung der Dekoration möglich
|
|
viele kleine Objekte
|
|
Referenzen von Dekorierer und eigentlichem Objekt verschieden:
Vorsicht bei Referenz-Vergleichen
|
| |
Implementierung |
|
|
abstrakte Dekorierer-Klasse kann entfallen, wenn nur
eine Dekoration erwünscht ist
|
|
dann: gleiche Struktur wie Proxy
|
|
keine Datenfelder in die abstrakte Komponenten-Klasse
diese sind im Dekorierer überflüssig
|
|
Komponenten-Klasse möglichst leichtgewichtig
wenig Datenfelder
|
|
möglicherweise Zwischenschritt einziehen
|
| |
Beispiel |
Dekoration von streams
z.B. Zusatzinformation über # Zeichen, # Zeilen, ...
|
| |
Bekannte Verwendungen |
filter streams in JDK1.1
|
| |
verwandte Muster |
|
|
arbeitet mit unterschiedlichen Schnittstellen |
| |
|
aggregiert Objekte
|
| |
|
|
| |