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
  | 
  |  |