Kompositum [ Übersicht ] [ Beispiel ] [ Quellen ] [ Home Entwurfsmuster ]


Beschreibung


Die Grundklasse in diesem Beispiel für das Muster ist die Klasse Graphik. Sie repräsentiert sowohl die Graphikprimitive, als auch die Behälterklasse für weitere Graphiken. Obwohl diese Klasse keine Instanzen hat, wird der Klient im Allgemeinen mit Objekten dieser Klasse arbeiten. Im Beispielprogramm kann man die Koordinaten der Graphik neu setzen, und sie auffordern, sich neu zu zeichnen. Beim Zeichnen soll es zusätzlich die Möglichkeit geben hervorgehoben und markiert zu wählen.
Die Behälterklasse ist die Klasse Kompositum. Sie ist von Graphik abgeleitet und enthält eine Liste von Kindgraphiken. Aufrufe zum Zeichnen und zum Setzen der Koordinaten müssen an diese Graphiken weitergeleitet werden. Zur Deklaration der Verwaltungsoperationen der Kindgraphiken wie z.B. Graphik hinzufügen und entfernen gib es zwei Möglichkeiten:

1. Die Verwaltungsoperationen der Kindgraphiken werden in der Klasse Graphik deklariert. Der Vorteil ist, daß die Graphiken einheitlich sind, der Nachteil ist ein gewisses Sicherheitsrisiko, weil die Graphikprimitive solche Funktionen nicht unterstützen.

2. Die Operationen zur Verwaltung der Kindgraphiken werden im Kompositum deklariert. Hier ist der Vorteil, daß für die Graphikprimitive keine solchen Funktionen implementiert werden müssen. Der Nachteil hingegen ist, daß der Klient die Graphiken doch unterscheiden muß. Es ist ein Test nötig, ob es sich um ein Kompositum handelt. Danach muß ein Casting durchgeführt werden.

Da bei Eiffel ein Casting absolut sicher ist, wurde die letztere Variante gewählt.

Als Beispiel für die Graphikprimitive wurden die Klassen Linie und Ellipse implementiert. Sie erben ebenfalls von der Klasse Graphik. Bei der Mothode zum Setzen der Koordinaten wird die Standartimplementation übernommen, die Methode zum Zeichen wird erweitert.
Damit daraus ein ganzes Programm wird waren noch einige Klassen zusätzlich nötig. Die Klasse BasisGraphik ist die wahre Schnittstelle vom Benutzer auf eine Graphik. Sie enthält ein Graphik-Objekt und einige weitere Features, was der Klasse Graphik eine Menge Redundanz erspart. Hier wird der Name einer Graphik gespeichert und, ob sie hervorgehoben oder markiert ist.
Alle Basis-Graphiken werden in einem Objekt der Klasse GraphikContainer gesammelt. Hier werden Funktionen bereitgestellt, die sich auf alle markierten Basis-Graphiken auswirken. Speziell wird hier das Gruppieren in ein Kompositum und das Degruppieren in die Teilgraphiken geregelt. Ferner werden hier die Basis-Graphiken markiert.
Der Graphikcontainer arbeitet eng mit dem Hauptfenster von der Klasse MAIN_WINDOW zusammen. Hier wird das Fenster mit den Graphiken dargestellt, das auf Eingaben des Benutzers wartet.

Zum Ausprobieren müssen sample.exe und melted.eif in ein Verzeichnis geladen werden. Sie liegen beide in einer Zip-Datei kompromiert vor. Das Programm funktioniert unter Win95 und NT.

 Abb. 1: Struktur des Beispiels



[ Übersicht ] [ Beispiel ] [ Quellen ] [ Home Entwurfsmuster ]
Stand: 31.03.2005, Autor: Stefan Bünnig