\documentclass{bschlangaul-aufgabe} \bLadePakete{java,uml} \begin{document} \bAufgabenMetadaten{ Titel = {Aufgabe 2}, Thematik = {Countdown und Observer}, Referenz = 66116-2018-F.T2-TA2-A2, RelativerPfad = Examen/66116/2018/03/Thema-2/Teilaufgabe-2/Aufgabe-2.tex, ZitatSchluessel = examen:66116:2018:03, BearbeitungsStand = mit Lösung, Korrektheit = unbekannt, Ueberprueft = {unbekannt}, Stichwoerter = {Beobachter (Observer), Klassendiagramm, Implementierung in Java}, EinzelpruefungsNr = 66116, Jahr = 2018, Monat = 03, ThemaNr = 2, TeilaufgabeNr = 2, AufgabeNr = 2, } Es soll eine (kleine) Anwendung entwickelt werden, in der ein Zähler in 1-er Schritten von 5000 bis 0 herunterzählt. Der Zähler soll als Objekt der Klasse \bJavaCode{Countdown} realisiert werden, die in UML-Notation dargestellt ist. Das Attribut value soll den aktuellen Zählerstand speichern, der mit dem Konstruktor zu initialisieren ist. Die Methode \bJavaCode{getValue} soll den aktuellen Zählerstand liefern und die Methode \bJavaCode{countdown} soll den Zähler von 5000 bis 0 herunterzählen. \index{Beobachter (Observer)} \footcite{examen:66116:2018:03} Der jeweilige Zählerstand soll von einem Objekt der in untenstehender Abbildung angegebenen Klasse \bJavaCode{Display} am Bildschirm ausgegeben werden. Bei der Konstruktion eines \bJavaCode{Display}-Objekts soll es mit einem \bJavaCode{Countdown}-Objekt verbunden werden, indem dessen Referenz unter \bJavaCode{myCountdown} abgespeichert wird. Die Methode \bJavaCode{update} soll den aktuellen Zählerstand vom \bJavaCode{Countdown}-Objekt holen und mit \bJavaCode{System.out.println} am Bildschirm ausgeben. Dies soll zu Beginn des Zählprozesses und nach jeder Änderung des Zählerstands erfolgen. \begin{center} \begin{tikzpicture} \umlclass{Display}{}{ +Display(cd: Countdown)\\ +update() } \umlclass[x=7]{Countdown}{ -value: Integer }{ +Countdown() \\ +getValue(): Integer\\ +countdown() } \umluniassoc[arg2=-myCountdown,mult2=1,pos2=0.65]{Display}{Countdown} \end{tikzpicture} \end{center} \noindent Damit das \bJavaCode{Display}-Objekt über Zählerstände des \bJavaCode{Countdown}-Objekts informiert wird, soll das Observer-Pattern angewendet werden. Untenstehende Abbildung zeigt die im Observer-Pattern vorkommenden abstrakten Klassen. (Kursivschreibweise bedeutet abstrakte Klasse bzw. abstrakte Methode.) \begin{center} \begin{tikzpicture} \umlclass[type=abstract]{Subject}{}{ +attach(o: Observer)\\ +notify() } \umlclass[x=6,type=abstract]{Observer}{ }{ +update() } \umluniassoc[arg2=-observers,mult2=1,pos2=0.7]{Subject}{Observer} \end{tikzpicture} \end{center} \begin{enumerate} %% % a) %% \item Welche Wirkung haben die Methoden \bJavaCode{attach} und \bJavaCode{notify} gemäß der Idee des Observer-Patterns? \begin{bAntwort} Das beobachtete Objekt bietet mit der Methode \bJavaCode{attach} einen Mechanismus, um Beobachter anzumelden und diese über Änderungen zu informieren. Mit der Methode \bJavaCode{notify} werden alle Beobachter benachrichtigt, wenn sich das beobachtete Objekt ändert. \end{bAntwort} %% % b) %% \item Welche der beiden Klassen \bJavaCode{Display} und \bJavaCode{Countdown} aus obenstehender Abbildung spielt die Rolle eines \bJavaCode{Subject} und welche die Rolle eines \bJavaCode{Observer}? \begin{bAntwort} Die Klasse \bJavaCode{Countdown} spielt die Rolle des \bJavaCode{Subject}s, also des Gegenstands, der beobachtet wird. Die Klasse \bJavaCode{Display} spielt die Rolle eines \bJavaCode{Observer}, also die Rolle eines Beobachters. \end{bAntwort} %% % c) %% \item Erstellen Sie ein Klassendiagramm\index{Klassendiagramm}, das die beiden obenstehenden gegebenen Diagramme in geeigneter Weise, \dh entsprechend der Idee des Observer-Patterns, zusammenfügt. Es reicht die Klassen und deren Beziehungen anzugeben. Eine nochmalige Nennung der Attribute und Methoden ist nicht notwendig. \begin{bAntwort} \begin{tikzpicture} \umlclass[type=abstract]{Subject}{}{ +attach(o: Observer)\\ +notify() } \umlclass[x=6,type=abstract]{Observer}{ }{ +update() } \umluniassoc[arg2=-observers,mult2=1,pos2=0.7]{Subject}{Observer} \umlclass[y=-3]{Countdown}{ -value: Integer }{ +Countdown() \\ +getValue(): Integer\\ +countdown() } \umlclass[x=6,y=-3]{Display}{}{ +Display(cd: Countdown)\\ +update() } \umluniassoc[arg2=-myCountdown,mult2=1,pos2=0.65]{Display}{Countdown} \umlinherit{Countdown}{Subject} \umlinherit{Display}{Observer} \end{tikzpicture} \end{bAntwort} %% % d) %% \item Unsere Anwendung soll nun in einer objektorientierten Programmiersprache Ihrer Wahl (\zB Java oder C++) implementiert\index{Implementierung in Java} werden. Dabei soll von folgenden Annahmen ausgegangen werden: \begin{itemize} \item Das Programm wird mit einer main-Methode gestartet, die folgenden Rumpf hat: \begin{bJavaAngabe} public static void main(String[] args){ Countdown cd = new Countdown(); new Display(cd); cd.countdown(); } \end{bJavaAngabe} \item Die beiden Klassen Subject und Observer sind bereits gemäß der Idee des Observer-Patterns implementiert. \end{itemize} Geben Sie auf dieser Grundlage eine Implementierung der beiden Klassen \bJavaCode{Display} und \bJavaCode{Countdown} an, so dass das gewünschte Verhalten, \dh Anzeige der Zählerstände und Herunterzählen des Zählers, realisiert wird. Die Methoden der Klassen \bJavaCode{Subject} und \bJavaCode{Observer} sind dabei auf geeignete Weise zu verwenden bzw. zu implementieren. Geben Sie die verwendete Programmiersprache an. \begin{bAntwort} \def\TmpCode#1{\bJavaExamen{66116}{2018}{03}{#1}} \TmpCode{Client} \TmpCode{Subject} \TmpCode{Observer} \TmpCode{Countdown} \TmpCode{Display} \end{bAntwort} \end{enumerate} \end{document}