Klassifizierung |
objektbasiertes Strukturmuster
|
| |
Zweck |
einheitliche Verarbeitung von
Hierarchien
Baumstrukturen
Graphen
rekursiven Datenstrukturen
|
| |
Alias |
composite
|
| |
Motivation |
widget Bibliotheken
|
| |
Beispiel |
|
| |
Anwendbarkeit |
|
|
gerichtete Graphen, Bäume
|
|
Klienten sollen zusammengesetzte und einfache
Objekte nicht unterscheiden können
|
|
NICHT: Transformationsalgorithmen
diese müssen die Struktur analysieren
|
| |
Struktur |
Strukturdiagramm
|
| |
Teilnehmer |
|
Komponente |
abstrakt
legt gemeinsame Schnittstelle fest
einschließlich Einfügen, Löschen, Suchen, Selektieren
kann default-Verhalten implementieren
|
Blatt |
konkret
legt Verhalten einfacher Objekte fest
legt die Struktur der Blätter fest
|
Kompositum |
konkret
legt die Struktur und das Verhalten der inneren Knoten fest
|
Klient |
benutzt ausschließlich Referenzvariablen
vom Typ Komponente
|
| |
Konsequenzen |
|
|
zusammengesetzte Objekte können beliebig komplex werden
|
|
Klienten sehen nur die Schnittstelle, nicht die Komplexität
|
|
flexibel:
neue Komponenten, Blätter oder Komposita,
können einfach hinzugefügt werden ohne die Klienten zu verändern.
|
| |
?
|
Einfachstes Kompositum: Abstrakte Syntax und Klassendiagramm?
|
Implementierung |
|
|
verschiedene Klassen für Blätter
|
| |
|
verschiedene Klassen für Komposita
|
| |
|
Containerklassen für Komposita:
Liste, Menge, Tabelle
|
| |
|
typische Verarbeitungsstrategien für Listen, Mengen, ....
aber im Strukturdiagramm nicht unterscheidbar
|
| |
|
Zugriffspfade
|
| |
|
nur von der Wurzel zu den Blättern:
Navigation nur durch rekursiven Abstieg
Transformation einfach
|
| |
|
explizite Referenz auf Vorgänger:
Traversierung flexibler: Iterator
|
| |
|
bei Graphen: mehrere Vorgänger: explizite Verzweigung
aufwendiger
Transformationsoperationen aufwendiger
|
| |
|
|
| |
|
Zustandsänderung von Knoten: Seiteneffekte
|
| |
|
Bei breiter Schnittstelle möglichst viele
default-Implementierungen in der abstrakten Klassen realisieren
--> Arbeitsaufwand bei Erweiterungen minimieren
|
| |
Aufgabe |
Arithmetische Audrücke mit ganzzahliger und
Fließkomma-Arithmetik,
mit den üblichen unären und binären arithmetischen
Operatoren
und mit Konversion zwischen Ganzzahl- und Fließkomma-Arithmetik
|
Lösungen |
|
|
|
| |
Fallstudie |
|
?
|
Lösung: Abstrakte Syntax und Java-Implementierung
|
| |
Bekannte Verwendungen |
überall, sowie die Objekte und Komponenten der Objekte beliebig komplex werden können
|
| |
verwandte Muster |
|
|
|
| |
|
für Blätter zur Speicherplatzoptimierung
|
| |
|
für die Traversierung der zusammengesetzten Objekte
|
|
besser zur Traversierung geeignet als der Iterator,
da keine zusätzlichen Objekte für die Verwaltung
der Position im Kompositum notwendig sind
|
|
für die Traversierung eines Kompositums mit
variablen Verarbeitungs-Methoden
|
| |