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