%Teilweise Erzeugt mit dem LaTeX-Generator: http://latex.sehnot.de

%Schriftgröße, Layout, Papierformat, Art des Dokumentes
\documentclass[10pt,oneside,a4paper]{scrartcl}

%Einstellungen der Seitenränder
\usepackage[left=2cm,right=2cm,top=1.5cm,bottom=1.5cm,includeheadfoot]{geometry}

%neue Rechtschreibung
\usepackage[ngerman]{babel}

%Umlaute ermöglichen
\usepackage[utf8]{inputenc}

%Gesamtseitenzahl
\usepackage{lastpage}

% Kopf- und Fußzeile
\usepackage[automark]{scrpage2}

%Quellcode-Listings
\usepackage{listings}

%Hyperlinks
\usepackage{hyperref}

%Kopfzeile
\ihead{Softwaretechnik}
\chead{}
\ohead{http://kohnlehome.de/informatik/observer.pdf}
\setheadsepline{0.5pt}

%Fußzeile
\setfootsepline{0.5pt}
\ifoot{Franz Kohnle}
\cfoot{Seite \thepage\ von  \pageref{LastPage}}
\ofoot{\today}

\pagestyle{scrheadings}

\begin{document}

% Überschrift 
\begin{center}
\LARGE % Schriftgröße
\bfseries % Fettdruck
\sffamily % Serifenlose Schrift
Design Pattern: Observer (Beobachter)
\end{center}

\section{Designprinzip}
Bei Änderung des Zustands (bzw. der Daten) des Subjekts werden alle Beobachter benachrichtigt.

Das Subjekt braucht die Struktur der Beobachter nicht zu kennen.

Es gibt zwei Varianten:

\begin{itemize}
\item PUSH: Die Daten werden bei der Benachrichtigung der Beobachter gleich mitgeliefert.
\item PULL: Die Nachricht vom Subjekt an die Beobachter enthält noch nicht die Daten, sondern nur die Nachricht, dass sich diese geändert haben. Die Beobachter müssen dann selbst die von ihnen benötigten Daten anfordern.
\end{itemize}

\section{Java-Code}

\subsection{Subject (Observable)}
\lstset{language=Java}
\begin{lstlisting}[frame=tlRB]
public class Subject {
	// Membervariablen fuer Daten
	private int daten = 0;
	
	// Liste von Beobachtern
	private ArrayList<BeobachterSchnittstelle> beobachter 
	                       = new ArrayList<BeobachterSchnittstelle>();
	
	// Beobachter muessen sich registrieren
	public void registrieren(BeobachterSchnittstelle b){
	    beobachter.add(b);
	}
	
	// alle Beobachter erhalten Aenderungsmeldung
	private void broadcast(){
		for (int i = 0; i < beobachter.size(); i++) {
			beobachter.get(i).update();
			// bei PUSH: Daten als Argumente uebergeben
		}
	}
	
	// Methoden zum Lesezugriff auf Daten bei PULL
	public int getDaten() {
	    return daten;
	}

	// Broadcast bei Aenderung der Daten
	public void setDaten(int n) {
		daten = n;
		broadcast();
	}
}

\end{lstlisting}

\pagebreak

\subsection{Beobachterschnittstelle (Observer)}
\lstset{language=Java}
\begin{lstlisting}[frame=tlRB]
public interface BeobachterSchnittstelle {
	public void update(); // Bei PUSH: Daten als Parameter
}
\end{lstlisting}

\subsection{Konkrete Beobachter}
\lstset{language=Java}
\begin{lstlisting}[frame=tlRB]
public class BeobachterA implements BeobachterSchnittstelle{
	private Subject subject;
	
	public BeobachterA(Subject subject) {
		this.subject = subject;
		subject.registrieren(this);
	}
	
	@Override
	public void update() {
	    // bei PUSH: Daten werden als Parameter uebergeben
	    // bei PULL: Daten muessen extra geholt werden 
	    int daten = subject.getDaten();
	    System.out.println("A:" + daten);
	}
}
\end{lstlisting}

\lstset{language=Java}
\begin{lstlisting}[frame=tlRB]
public class BeobachterB implements BeobachterSchnittstelle{
	private Subject subject;
	
	public BeobachterB(Subject subject) {
		this.subject = subject;
		subject.registrieren(this);
	}
	
	@Override
	public void update() {
	    // bei PUSH: Daten werden als Parameter uebergeben
	    // bei PULL: Daten muessen extra geholt werden 
	    int daten = subject.getDaten();
	    System.out.println("B:" + daten);
	}
}
\end{lstlisting}

\subsection{Verwendung des Subjekts}
\lstset{language=Java}
\begin{lstlisting}[frame=tlRB]
Subject subject = new Subject();
BeobachterA beobachterA = new BeobachterA(subject);
BeobachterB beobachterB = new BeobachterB(subject);
subject.setDaten(5); // Ausgabe: "A:5 B:5"
\end{lstlisting}


\begin{thebibliography}{999}
\bibitem [Head First Design Patterns]{} \url{http://www.oreilly.de/catalog/9780596007126/}
\bibitem [Wikipedia]{}  \url{http://de.wikipedia.org/wiki/Observer_(Entwurfsmuster)}
\end{thebibliography}

\end{document}
