%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/mvc.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: Model-View-Controller
\end{center}

\section{Designprinzip}

\begin{itemize}
\item Model: verwaltet Daten, benachrichtigt View (Observer) bei Änderung
\item View: Beobachter von Model (Anzeige der Daten), verwendet Controller als Strategie (Benutzeraktionen)
\item Controller: verarbeitet Benutzeraktionen und leitet sie an Model weiter, steuert View (Steuerelemente deaktivieren)
\end{itemize}

\section{Java-Code}

\subsection{Modelschnittstelle}
\lstset{language=Java}
\begin{lstlisting}[frame=tlRB]
public interface ModelSchnittstelle {
	// View (Beobachter) muss sich registrieren
	void registrieren(ViewSchnittstelle view);
	
	// Methoden zum Lesezugriff auf Daten fuer View
	int getDaten();
	
	// Methoden zum Schreibzugriff fuer den Controller
	void aendern();
}
\end{lstlisting}

\subsection{Viewschnittstelle}
\lstset{language=Java}
\begin{lstlisting}[frame=tlRB]
public interface ViewSchnittstelle {
	// Diese Methode ruft das Model (Subject) bei Aenderung der Daten auf
	void update();
	
	// Diese Methoden kann der Controller aufrufen
	// z.B. GUI erstellen,
	// Steuerelemente deaktivieren
	void fensterErstellen();
}
\end{lstlisting}

\subsection{Controllerschnittstelle}
\lstset{language=Java}
\begin{lstlisting}[frame=tlRB]
public interface ControllerSchnittstelle {
	// Diese Methoden kann die View aufrufen
	// Benutzeraktionen werden von View an Controller uebermittelt
	void aendern();
}
\end{lstlisting}

\subsection{Hauptprogramm}
\lstset{language=Java}
\begin{lstlisting}[frame=tlRB]
ModelSchnittstelle model = new KonkretesModel();
ControllerSchnittstelle controller = new KonkreterController(model);
\end{lstlisting}



\subsection{Konkretes Model}
\lstset{language=Java}
\begin{lstlisting}[frame=tlRB]
public class KonkretesModel implements ModelSchnittstelle {
	// Model kennt nur Referenzen von allen Views (Observer)
	// Model kennt Controller nicht
	private ArrayList<ViewSchnittstelle> beobachterliste
				= new ArrayList<ViewSchnittstelle>();
	
	// Vom Model selbst verwaltete Daten
	private int daten;
	private Random random = new Random();
	
	// Views (Observer) muessen sich registrieren
	@Override
	public void registrieren(ViewSchnittstelle view) {
		beobachterliste.add(view);
	}
	
	// Views (Observer) werden ueber Aenderung der Daten benachrichtigt
	private void broadcast(){
		for(int i=0; i<beobachterliste.size(); i++){
			beobachterliste.get(i).update();
		}
	}

	// Lesezugriff von aussen auf Daten (fuer Views, Observer)
	@Override
	public int getDaten() {		
		return daten;
	}

	// Schreibzugriff von aussen auf Daten (fuer Controller)
	@Override
	public void aendern() {
		daten = random.nextInt();
		// bei Aenderung der Daten alle Views benachrichtigen
		broadcast();		
	}
}
\end{lstlisting}


\pagebreak


\subsection{Konkrete View}
\lstset{language=Java}
\begin{lstlisting}[frame=tlRB]
public class View implements ViewSchnittstelle{
	// View holt sich Daten vom Model
	private ModelSchnittstelle model;
	
	// View uebergibt Benutzeraktionen an Controller
	private ControllerSchnittstelle controller;
	
	// GUI-Elemente
	private JButton button;

	
	public View(ControllerSchnittstelle controller,
			ModelSchnittstelle model) {
		// View kennt Controller zur Uebergabe von Aktionen
		this.controller = controller;
		
		// View kennt Model (Subject) zum Empfangen von Aenderungsmeldungen
		// und zum Holen der Daten
		this.model = model;
		model.registrieren(this);
				
	}

	// wird vom Model (Subject) aufgerufen
	@Override
	public void update() {
		// View holt Daten selbst (PULL)
		int daten = model.getDaten();
		button.setText("Zahl: " + daten);
	}

	// GUI
	@Override
	public void fensterErstellen() {
		JFrame frame = new JFrame();
		frame.setSize(200,200);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		button = new JButton("Drueck");
		frame.add(button);		
		button.addActionListener(new ActionListener() {			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				// Benutzeraktion wird an Controller uebermittelt
				controller.aendern();				
			}
		});
		frame.setVisible(true);		
	}
}
\end{lstlisting}


\pagebreak


\subsection{Konkreter Controller}
\lstset{language=Java}
\begin{lstlisting}[frame=tlRB]
public class KonkreterController implements ControllerSchnittstelle {
	// Controller ist Vermittler zwischen View und Model
	private ModelSchnittstelle model;
	private View view;
	
	// Controller erstellt View
	public KonkreterController(ModelSchnittstelle model) {
		this.model = model;
		view = new View(this,model);
		view.fensterErstellen();		
	}

	// Controller verarbeitet Nachrichten von View
	// und gibt sie an Model weiter
	@Override
	public void aendern() {
		model.aendern();
	}
}
\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/Model_View_Controller}
\end{thebibliography}

\end{document}
