Beim Entwurf der MVC-Struktur müssen wir die Aufgaben auf
die drei Klassen verteilen:
Model
verwaltet die aktuelle Zeit, die Taktfrequenz und die Information, ob die Uhr
gerade läuft oder steht.
View (für die digitale Darstellung) enthält die Anzeige der Zeit
(auf einem JLabel)
sowie die drei Knöpfe Ein,
Aus und
Um.
Control verwaltet die Ereignisse:
das Ticken einmal pro Sekunde sowie die Lauscher (listener) für die Knopfdrücke.
Beim Entwurf der Schnittstellen müssen wir überlegen, wer
braucht was von wem (und wann), um seine Arbeit erledigen zu können.
Model braucht nichts, es ist autonom. View braucht nach jeder Veränderung die aktuelle Zeit sowie die Taktfrequenz von Model. Control muss Model nach dem Tick benachrichtigen können, sowie darüber, ob die Uhr angehalten oder gestartet wurde. Control muss am Anfang die Lauscher für die Knöpfe an View übergeben, sie immer nach der Veränderung der Zeit (nach einem Tick) benachrichtigen (damit sie die Anzeige aktualisiert), sowie über Knopfdrücke, damit sie die Knöpfe sperrt (disable) bzw. erlaubt (enable).
Wenn wir diese Import-Anforderungen invertieren, bekommen
wir folgende Exports:
Model
exportiert die aktuelle Uhrzeit und die Frequenz an
View, empfängt das Ticken sowie
die drei Tastendrücke von
Control. Die ersten beiden verändern den Zustand von
Model nicht,
sie liefern nur Information; daher heißen sie
Informatoren und werden in Java als
Funktionen ("getter", mit einem Präfix get im
Namen) programmiert. Das Empfangen von Ereignissen kann den Zustand von
Model
verändern; daher heißen sie Mutatoren
und werden typischerweise als Prozeduren (void-Methoden)
programmiert.
View
empfängt von Control
die Nachricht, wann sie
die Zeitanzeige aktualisieren (tick()) sowie die Knopfe zu verbieten bzw. erlauben
(bei start() und
stopp()) soll.
Diese sind alle Mutatoren:
public
interface IModel {
static
class Uhrzeit { … } // wie oben im KreisUhr
void
tick();
void
start();
void
stopp();
void umschalten();
Uhrzeit getUhrzeit();
long
getFrequenz(); }
public
interface
IView {
void
start();
void
stopp();
void
tick(); }
Wie oben erläutert, braucht
Control keine Schnittstelle.
Version: 19. April 2012
© Prof. Solymosi, 20102 Beuth-Hochschule für Technik Berlin, Fachbereich VI (Informatik und Medien)
solymosibht-berlin.de