\documentclass{bschlangaul-aufgabe}
\bLadePakete{java,uml,entwurfsmuster}
\begin{document}
\bAufgabenMetadaten{
  Titel = {Aufgabe 2},
  Thematik = {Beatles},
  Referenz = 66116-2018-H.T1-TA1-A2,
  RelativerPfad = Examen/66116/2018/09/Thema-1/Teilaufgabe-1/Aufgabe-2.tex,
  ZitatSchluessel = examen:66116:2018:09,
  BearbeitungsStand = mit Lösung,
  Korrektheit = unbekannt,
  Ueberprueft = {unbekannt},
  Stichwoerter = {Zustand (State), Klassendiagramm zeichnen, Zustandsdiagramm zeichnen},
  EinzelpruefungsNr = 66116,
  Jahr = 2018,
  Monat = 09,
  ThemaNr = 1,
  TeilaufgabeNr = 1,
  AufgabeNr = 2,
}

Gegeben sei das Java-Programm:
\index{Zustand (State)}
\footcite{examen:66116:2018:09}

\bJavaExamen[firstline=3]{66116}{2018}{09}{beatles/Music}

\begin{enumerate}

%%
% a)
%%

\item Zeichnen Sie ein UML-Klassendiagramm\index{Klassendiagramm zeichnen}, das
die statische Struktur des Programms modelliert. Instanzvariablen mit
einem Klassentyp sollen durch gerichtete Assoziationen mit Rollennamen
und passender Multiplizität am gerichteten Assoziationsende modelliert
werden. Alle aus dem Programmcode ersichtlichen statischen Informationen
sollen in dem Klassendiagramm dargestellt werden.

\begin{bAntwort}
\begin{tikzpicture}[scale=0.7,transform shape]
  \umlclass[x=-6,y=5]{Music}{}{
    +help()\\
    +obladi()\\
    +yesterday()\\
  }
  \umlclass[x=0,y=5,type=abtract]{Beatle}{}{
    +help(m : Music)\\
    +obladi(m : Music)\\
    +yesterday(m : Music)\\
  }
  \umlclass[x=-6,y=0]{George}{}{
    +help(m : Music)\\
    +obladi(m : Music)\\
    +yesterday(m : Music)\\
  }
  \umlclass[x=-2,y=0]{John}{}{
    +help(Music m)\\
    +obladi(Music m)\\
    +yesterday(Music m)\\
  }
  \umlclass[x=2,y=0]{Paul}{}{
    +help(Music m)\\
    +obladi(Music m)\\
    +yesterday(Music m)\\
  }
  \umlclass[x=6,y=0]{Ringo}{}{
    +help(Music m)\\
    +obladi(Music m)\\
    +yesterday(Music m)\\
  }

  \umlVHVreal{George}{Beatle}
  \umlVHVreal{John}{Beatle}
  \umlVHVreal{Paul}{Beatle}
  \umlVHVreal{Ringo}{Beatle}

  \umlaggreg[arg=state,pos=0.8]{Music}{Beatle}

  \umlnote[x=-2.5,y=8,width=4cm]{Music}{
    state.help(m : Music)\\
    state.obladi(m : Music)\\
    state.yesterday(m : Music)\\
  }
\end{tikzpicture}
\end{bAntwort}

\end{enumerate}

\noindent
Das Programm implementiert ein Zustandsdiagramm,
das das Verhalten von Objekten der Klasse \bJavaCode{Music} beschreibt.
Für die Implementierung wurde das Design-Pattern \texttt{STATE}
angewendet.

\begin{enumerate}
\setcounter{enumi}{2}

%%
% b)
%%

\item Geben Sie die statische Struktur des STATE-Patterns\index{Zustand
(State)} an und erläutern Sie, welche Rollen aus dem Entwurfsmuster den
Klassen des gegebenen Programms dabei zufallen und welche Operationen
aus dem Entwurfsmuster durch (ggf. mehrere) Methoden in unserem
Beispielprogramm implementiert werden. Es ist von den \zB im
Design-Pattern-Katalog von Gamma et al. verwendeten Namen auszugehen,
das heißt von Klassen mit Namen \bJavaCode{Context},
\bJavaCode{State}, \bJavaCode{ConcreteStateA},
\bJavaCode{ConcreteStateB} und von Operationen mit Namen
\bJavaCode{request} und \bJavaCode{handle}.

\begin{bAntwort}
\bEntwurfsZustandUml

\bEntwurfsZustandAkteure

\end{bAntwort}

\item Zeichnen Sie das UML-Zustandsdiagramm\index{Zustandsdiagramm zeichnen} (mit
Anfangszustand), das von dem Programm implementiert wird. Dabei muss -
gemäß der UML-Notation - unterscheidbar sein, was Ereignisse und was
Aktionen sind. In dem Diagramm kann zur Vereinfachung statt
\bJavaCode{System.out.println ("x")} einfach \bJavaCode{"x"}
geschrieben werden.

\begin{bAntwort}
\begin{center}
\begin{tikzpicture}[font=\scriptsize,scale=0.6,transform shape]

\umlstateinitial[y=1,name=Init]

\begin{umlstate}[x=0,y=-9]{George}
\end{umlstate}

\begin{umlstate}[x=10,y=-2]{John}
\end{umlstate}

\begin{umlstate}[x=0,y=-2]{Paul}
\end{umlstate}

\begin{umlstate}[x=10,y=-9]{Ringo}
\end{umlstate}

\umltrans{Init}{Paul}

\umltrans[arg={help() / “help”},pos=0.5]{George}{John}
\umltrans[arg=yesterday() / “yesterday”,pos=0.5]{George}{Paul}

\umltrans[arg=help() / “help”,pos=0.5]{John}{Paul}
\umltrans[arg=obladi() / “obladi”,pos=0.5]{John}{Ringo}

\umltrans[arg=help() / “help”,pos=0.5]{Paul}{George}
\umltrans[recursive=170|190|0.5cm,recursive direction=left to left,arg=yesterday() / “yesterday”]{Paul}{Paul}

\umltrans[arg=help() / “help”,pos=0.5]{Ringo}{John}
\umltrans[arg=yesterday() / “yesterday”,pos=0.5]{Ringo}{Paul}

\end{tikzpicture}
\end{center}
\end{bAntwort}

\end{enumerate}

\end{document}
