Bearbeiten der UML-Elemente
- Editor:
- zeigt Felder eines UmlElements
an
- erlaubt Editieren aller Felder
- ruft ggf. Editor für Part-Elemente auf
- wird beendet mit
- "Abbrechen" → alte Werte bleiben
- "Übernehmen" → update()
des bearbeiteten Objekts
- Beispiel FieldEditor
- Beispiel ClassEditor
- Erzeugen eines Editors:
- Benutzer klickt Edit-Button an, danach das zu editierende
Objekt
- DisplayMouseListener von UmlGui
- findet getroffenen View hitObjectView
- ruft hitObjectView.createEditor()
auf
- Problem: wie wird der richtige Editor (ClassEditor,
InterfaceEditor etc.) gefunden?
- Lösung mit Hilfe von Polymorphismus
- Pattern FactoryMethod
- Pattern-Typ Creational
- Problem
- ein neues Objekt soll erzeugt werden
- nur Oberklasse oder Interface ist explizit gegeben
- genauer Typ des Objekts ist erst zur Laufzeit festgelegt
- Lösung
- Erzeuger (Creator) ist ein
Interface oder eine abstrakte Klasse
- Erzeugerfunktion liefert einen abstrakten Obertyp (Product)
- zur Laufzeit sind der konkrete Erzeugertyp und damit
auch das erzeugte Objekt gegeben
- Konsequenzen
- viele Teile des Codes benötigen nur die Oberklasse,
nicht die (wechselnden) Details (+)
- Erzeuger-Hierarchie ist u.U. zusätzlich nötig
(-)
- Anwendung des Patterns:
- mit abstrakten Basisklassen statt Interfaces, etwa bei
angeklicktem
ClassView:
- Implementierung der abstrakten Erzeugerfunktion in ClassView
einfach
- return new ClassEditor((Class) m,
p);
- abstrakte Oberklasse Editor
- erzeugt gemeinsame Elemente (Buttons und Panels) sowie
Listener
- überlässt Hauptfenster mit buildMainPanel
den Kindern
- überlasst Übertragen der Daten zum Model
mit update den Kindern
- konkrete Unterklasse ClassEditor
- implementiert update, um Daten
an das Model Class weiterzugeben
- implementiert buildMainPanel,
um seine Komponenten einzubauen
- benutzt 2x ListEditorPanel
als Teilkomponente
- analog InterfaceEditor,
ObjectEditor,
MethodEditor,
FieldEditor
- Klonen:
- wegen Abbruchmöglichkeit Editieren nur an einer Kopie
(Klon) möglich
- Erzeugen eines Klons in Java
- Interface Cloneable implementieren
- Methode public Object clone()
implementieren
- super.clone() (in java.lang.Object)
aufrufen (kopiert Elemente flach)
- Referenzen der Unterobjekte selbst klonen
- z.B. Klonen der Field-Liste eines
Class-Objekts
- Vektor von Field-Elementen
klonen
- ergibt neuen Vektor mit Referenzen auf originale Field-Objekte
- danach alle Field-Elemente
klonen
- Problem bei ListEditorPanel:
- wird für Fields und Methods
benutzt
- muss bei "Ändern" einen Editor aufrufen
- bekommt nur Liste der UmlElements,
wissen nichts über Editoren
- Problem
- Woher weiss das ListEditorPanel,
welchen Editor es erzeugen soll?
- Lösung
- vom Aufrufer wird passender View elementView
als Konstruktor-Parameter mitgegeben
- elementView erzeugt passenden
Editor
- elementView wird auch benutzt,
um bei "Add" Standard-Element des richtigen Typs zu erzeugen