
meillo@11: % @file
meillo@28: % @brief   Referat DesignPatterns `Observer'
meillo@11: % @author  markus schnalke <meillo@marmaro.de>
meillo@11: % @since   2007-05-30
meillo@11: 
meillo@11: 
meillo@28: \documentclass[a4paper]{scrartcl}
meillo@11: 
meillo@28:   \usepackage[utf8]{inputenc}
meillo@11:   \usepackage{ngerman}
meillo@11:   \usepackage{graphicx}
meillo@11:   \usepackage[automark]{scrpage2}
meillo@11: 
meillo@28:   \setkomafont{sectioning}{\normalfont\normalcolor\bfseries}
meillo@28:   \setlength{\parindent}{0em}
meillo@28:   \setlength{\parskip}{1.0ex plus 1.0ex minus 0.5ex}
meillo@28:   \pagestyle{scrheadings}
meillo@28:   \setcounter{tocdepth}{2}
meillo@11: 
meillo@11: \begin{document}
meillo@11: 
meillo@11: 
meillo@11: 
meillo@11: 
meillo@11: 
meillo@28: %%%%  Titlepage  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
meillo@28: \begin{titlepage}
meillo@28:   \title{Observer-Pattern}
meillo@28:   \author{Markus Schnalke}
meillo@28:   \date{2007-07-04}
meillo@11: 
meillo@11: 
meillo@28:   \thispagestyle{empty}
meillo@11: 
meillo@11: 
meillo@28:   \begin{flushright}
meillo@11: 
meillo@28:   \rule[8cm]{0cm}{0cm}
meillo@28:   {\Huge Design Pattern\\ \textbf{Observer}}
meillo@11: 
meillo@28:   \rule[2cm]{0cm}{0cm}
meillo@28:   \textsc{Markus Schnalke\\MatNr: 039131}
meillo@11: 
meillo@28:   \end{flushright}
meillo@11: 
meillo@11: 
meillo@11: 
meillo@28:   \rule[7cm]{0cm}{0cm}
meillo@11: 
meillo@28:   \textit{Dies ist meine Ausarbeitung zum Design Pattern ``Observer'' im Rahmen der Vorlesung Softwaretechnik im Studiengang Wirtschaftsinformatik an der Hochschule Ulm.}
meillo@11: 
meillo@28:   {\tiny Dieses Dokument darf gerne zitiert, kopiert und weitergegeben werden. Ich bitte nur darum meinen Namen und einen Verweis auf meine Website (http://marmaro.de) zu erwähnen --- danke! }
meillo@11: 
meillo@11: 
meillo@28: \end{titlepage}
meillo@11: 
meillo@11: 
meillo@11: 
meillo@28: 
meillo@28: \tableofcontents
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: %%%%  Einleitung  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
meillo@28: \newpage
meillo@28: \section{Einleitung}
meillo@28: 
meillo@28: Ich möchte im Folgenden einen Ansatz zum Verstehen von Design Patterns aufzeigen. Dazu nehme ich das Design Pattern ``Observer'', das ich Stück für Stück aus einer Situation der realen Welt herleiten werde. Es geht mir dabei nicht primär darum euch dieses Pattern zu erklären, vielmehr soll das Erfassen des Zusammenhangs zwischen Realität und Design Patterns gefördert werden.
meillo@28: 
meillo@28: Mein Ziel ist es die \textit{Natürlichkeit} von Design Patterns darzustellen --- weil sie dem Vorgehen in der Realität entsprechen!
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: \section{Meine Vorgehensweise}
meillo@28: 
meillo@28:   \begin{quote}
meillo@28:     Design Pattern sind ``Best Practices'' (= Erfolgsrezepte), meist \textbf{nach Vorbildern in der Realität}.
meillo@28:   \end{quote}
meillo@28:   
meillo@28:   Aus diesem Grund möchte ich nun anhand eines Beispiels aus dem täglichen Leben zeigen, dass das Design Pattern \textbf{Observer} ein absolut natürliches Vorgehen ist, das bei ähnlichen Situationen in Programmen deshalb ebenso verwendet werden sollte. Dass ich hier gerade das Pattern \textbf{Observer} verwende, hat keinen besonderen Grund; es kann wohl (fast) jedes Pattern auf diese Weise verständlich und logisch gemacht werden.
meillo@28:   
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: \newpage
meillo@28: \section{Erarbeitung des Patterns}
meillo@28:   
meillo@28: \subsection{Ausgangssituation}
meillo@28:   Meine Ausgangssituation von der ich mich zu einer möglichst optimalen Lösung vorarbeiten möchte ist Folgende:
meillo@28: 
meillo@11:     \begin{itemize}
meillo@28:       \item Es gibt Personen die Etwas verkaufen möchten
meillo@28:       \item Es gibt Personen die Etwas kaufen möchten
meillo@11:       \item Sie wollen/sollen sich nicht kennen
meillo@11:     \end{itemize}
meillo@11: 
meillo@28:   Gesucht ist natürlich ein möglichst effektives Vorgehen. Eben das ist der Grund, weshalb wir Patterns verwenden möchten: Wir suchen eine effektive Standardlösung für  regelmäßig auftretende Problemstellungen.
meillo@28:   
meillo@11: 
meillo@11: 
meillo@11: 
meillo@28: \subsection{Mögliche Ansätze}
meillo@28: 
meillo@28:   Um systematisch vorzugehen, überlegen wir uns zunächst, welche primitiven Lösungen für unser Problem in Frage kommen. Dies wären zum Beispiel:
meillo@11:   \begin{itemize}
meillo@11:     \item Personen direkt ansprechen
meillo@11:     \item Laut in die Menge rufen
meillo@11:     \item Den Freunden erzählen, die es dann weitererzählen
meillo@11:   \end{itemize}
meillo@11: 
meillo@28:   Vermutlich wäre der Eine oder Andere (unbewusst) gleich höher eingestiegen, dennoch zeigen auch (oder gerade) diese simplen Vorgehensweisen Probleme auf, die sonst kaum explizit wahrgenommen werden.
meillo@28:   
meillo@28:   Dies sind unter anderem:
meillo@28:   
meillo@11:     \begin{itemize}
meillo@11:       \item Man weiß nicht wer Interesse hat
meillo@11:       \item nicht mal wieviele
meillo@11:       \item Manche Interessenten sind vielleicht nur zu bestimmten Zeiten da
meillo@28:       \item (... oder sie sind taub)
meillo@11:     \end{itemize}
meillo@11: 
meillo@28: 
meillo@11: 
meillo@11: 
meillo@11: 
meillo@11: \subsection{Erarbeitung einer Lösung}
meillo@11: 
meillo@28: \subsubsection{Eine (gute) Lösung: Pinnwand}
meillo@11: 
meillo@28: 
meillo@28: 
meillo@28:   \paragraph{Funktionsweise}
meillo@11:   \begin{itemize}
meillo@11:     \item Man kann Zettel anpinnen
meillo@11:     \item Hingehen und nach neuen Zetteln schauen
meillo@11:     \item Zettel lesen
meillo@11:     \item Zettel abnehmen
meillo@11:     \item Jeder der ein paar Fähigkeiten hat kann es
meillo@11:   \end{itemize}
meillo@28:   
meillo@11: 
meillo@28:   
meillo@11: 
meillo@28:   \paragraph{Probleme}
meillo@11:     \begin{itemize}
meillo@11:       \item Man muss hingehen, nur um festzustellen, dass nichts Neues dabei ist
meillo@11:       \item Man kann wichtige Zettel verpassen
meillo@11:       \item Zettel sollten nicht weggenommen werden können
meillo@11:     \end{itemize}
meillo@28:   
meillo@11: 
meillo@11: 
meillo@11: 
meillo@11: 
meillo@11: 
meillo@28: \subsubsection{Verbesserung: Pinnwand-Sekretärin}
meillo@11: 
meillo@28:   \paragraph{Lösung}
meillo@11:   \begin{itemize}
meillo@11:     \item Durch Studiengebühren wird eine Sekretärin für die Pinnwand angestellt
meillo@11:     \item Pinnwand und Sekretärin sind fortan eine Einheit
meillo@11:     \item Man kann bei ihr einen Zettel in Auftrag geben (auch telefonisch)
meillo@11:     \item (Sie schreibt mit lesbarer Schrift)
meillo@11:     \item Sie verhindert, dass Zettel abgenommen werden
meillo@11:   \end{itemize}
meillo@28:   
meillo@11: 
meillo@28:   
meillo@11: 
meillo@28:   \paragraph{Bestehendes Problem}
meillo@11:     \begin{itemize}
meillo@11:       \item Man läuft immer noch oft unnötig zur Pinnwand
meillo@11:     \end{itemize}
meillo@28:   
meillo@11: 
meillo@11: 
meillo@11: 
meillo@28: \subsubsection{2. Verbesserung: Pinnwand-Sekretärin mit Benachrichtigung}
meillo@11: 
meillo@28:   \paragraph{Lösung}
meillo@11:   \begin{itemize}
meillo@11:     \item Durch Studiengebühren wird eine längere Arbeitszeit der Sekretärin finanziert
meillo@11:     \item Man kann sich bei der Sekretärin nun als ``Interessierter'' registrieren
meillo@11:     \item Die Sekretärin trägt die Telefonnummer in eine Liste ein
meillo@28:     \item Zukünftig ruft sie alle Personen der Liste an, wenn sie einen neuen Zettel anpinnt
meillo@11:   \end{itemize}
meillo@28:   
meillo@11: 
meillo@11: 
meillo@11: 
meillo@28: \subsection{Zusammenfassung des Beispiels}
meillo@11: 
meillo@28:   \paragraph{Pinnwand + Sekretärin + Benachrichtigung}
meillo@11:     \begin{itemize}
meillo@11:       \item Man kann neue Zettel anpinnen lassen
meillo@11:       \item Man kann sich als Interessierter anmelden (und auch abmelden)
meillo@11:       \item Interessierte werden bei Änderungen der Pinnwand benachrichtigt
meillo@11:       \item Sie können dann zur Pinnwand gehen und sie sich anschauen
meillo@11:     \end{itemize}
meillo@28:   
meillo@11: 
meillo@28:   
meillo@11: 
meillo@28:   \paragraph{Eure Meinung?}
meillo@11:     \begin{itemize}
meillo@11:       \item Ist diese Struktur zufriedenstellend?
meillo@11:       \item Erfüllt sie alle Anforderungen?
meillo@11:       \item Was fehlt?
meillo@11:     \end{itemize}
meillo@28:   
meillo@11: 
meillo@11: 
meillo@11: 
meillo@11: 
meillo@11: 
meillo@11: 
meillo@11: 
meillo@11: 
meillo@11: 
meillo@11: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: \newpage
meillo@28: \section{Das Pattern}
meillo@28: 
meillo@28: 
meillo@28: \subsection{Überleitung}
meillo@28: 
meillo@28:   \paragraph{Neue Namen}
meillo@11:     \begin{itemize}
meillo@28:       \item Pinnwand-Sekretärin-Einheit $\rightarrow$ ``Subject''
meillo@28:       \item Die Zettel auf der Pinnwand $\rightarrow$ ``subjectState''
meillo@28:       \item Interessenten $\rightarrow$ ``Observers''
meillo@11:     \end{itemize}
meillo@11: 
meillo@28:   \paragraph{Schnittstellen}
meillo@28:     Die Fähigkeiten der Pinnwand/Sekretärin und Interessenten sind ihre ``Interfaces''.
meillo@11: 
meillo@28:     (vgl: taub, minimale Fähigkeiten, leserliche Schrift, ...)
meillo@28:   
meillo@11: 
meillo@11: 
meillo@11: 
meillo@28: \subsection{UML-Diagramme}
meillo@28:  \subsubsection{Struktur-Diagramm des Observers}
meillo@28: 
meillo@28:   \begin{figure}[hbt]
meillo@28:     \centering
meillo@28:     \includegraphics[width=12cm]{pics/observer_big.png}
meillo@28:     \caption{Struktur-Diagramm des Observers}
meillo@28:   \end{figure}
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28:  \subsubsection{Interaktions-Diagramm des Observers}
meillo@28:   \begin{figure}[hbt]
meillo@28:     \centering
meillo@28:     \includegraphics[width=12cm]{pics/observer-interaction_big.png}
meillo@28:     \caption{Interaktions-Diagramm des Observers}
meillo@28:   \end{figure}
meillo@28: 
meillo@28: 
meillo@11: 
meillo@11: 
meillo@11: % Daten aus der Beschreibung des Observers von GoF
meillo@11: % in welche Gruppen wird er eingeordnet
meillo@28:  \subsubsection{Klassifizierung nach GoF}
meillo@11: 
meillo@28:   \paragraph{Klassifizierung}
meillo@11:     Verhaltensmuster, objektbasierend
meillo@28:   
meillo@11: 
meillo@28:   \paragraph{Auch bekannt als}
meillo@11:     Publish-Subscribe, Dependents
meillo@28:   
meillo@11: 
meillo@28:   \paragraph{Zweck}
meillo@11:     Abhängigkeiten zwischen Objekten zu erstellen, sodass sich abhängige Objekte ändern, wenn sich das Objekt selbst ändert.
meillo@11:     % todo: besser formulieren
meillo@28:   
meillo@11: 
meillo@28:   \paragraph{Kurzbeschreibung}
meillo@11:     Schnittstellen anlegen, um Abhängigkeiten zwischen Objekten registriert
meillo@11:     werden können, und um die abhängigen Objekte über Zustandsänderungen zu
meillo@11:     informieren.
meillo@11:     % todo: Formulierung überdenken
meillo@28:   
meillo@11: 
meillo@11: 
meillo@11: 
meillo@28: 
meillo@28: \subsection{Beispiele für den Observer in der Praxis}
meillo@11: % Einsatzgebiete (MVC) und RL (Mailingslisten, Ebay-Suchabo)
meillo@11: % nicht aber (Blog + RSS)
meillo@11: 
meillo@28:   \paragraph{Beispiele}
meillo@11:     \begin{itemize}
meillo@11:       \item Observer ist sehr verbreitet
meillo@11:       \item v.a. MVC (Model = Subject; View = Observer)
meillo@11:       \item Mailinglisten
meillo@11:       \item Ebay Such-Abo
meillo@11:     \end{itemize}
meillo@28:   
meillo@11: 
meillo@28:   \paragraph{Aber}
meillo@11:     \begin{itemize}
meillo@11:       \item nicht Blog mit RSS-Feed!
meillo@11:     \end{itemize}
meillo@28:   
meillo@11: 
meillo@11: 
meillo@11: 
meillo@11: 
meillo@11: 
meillo@11: 
meillo@28: %\subsection{Erweiterungen}
meillo@28: %% Erweiterungen, verbleibende Probleme, Kompromisse beim Design
meillo@28: \subsection{Mögliche Erweiterungen des Patterns}
meillo@11: 
meillo@28:   \paragraph{Ein Observer und mehrere Subjects}
meillo@28:     \begin{itemize}
meillo@28:       \item Der Name des Subjects muss mitgesendet werden.
meillo@28:     \end{itemize}
meillo@28:   
meillo@11: 
meillo@28:   \paragraph{Nur für bestimmte Informationen anmelden}
meillo@28:     \begin{itemize}
meillo@28:       \item Oberservers melden sich nur für bestimmte Informationen an
meillo@28:       \item Es werden weniger uninteressante Updates gesendet
meillo@28:     \end{itemize}
meillo@28:   
meillo@28: 
meillo@28:   \paragraph{UpdateManager}
meillo@28:     \begin{itemize}
meillo@28:       \item Bei komplexen Update-Zusammenhängen empfehlenswert
meillo@28:       \item vermittelt zwischen Subject und Observer
meillo@28:       \item (Mehr dazu in der Ausarbeitung)
meillo@28:     \end{itemize}
meillo@28:   
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28:   \paragraph{Wer ruft notify() auf?}
meillo@28: 
meillo@28:   \subparagraph{Das Subject}
meillo@28:     \begin{itemize}
meillo@28:       \item[+] notify() wird sicher bei jedem setState() aufgerufen
meillo@28:       \item[-] hohe Update-Kosten bei Änderungen en-block
meillo@28:     \end{itemize}
meillo@28:   
meillo@28: 
meillo@28:   \subparagraph{Der Observer}
meillo@28:     \begin{itemize}
meillo@28:       \item[+] intelligenter Zeitpunkt des notify()-Aufrufs möglich
meillo@28:       \item[-] der Client darf den notify()-Aufruf nicht vergessen
meillo@28:     \end{itemize}
meillo@28:   
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: \newpage
meillo@11: \section{Zusammenfassung}
meillo@28:  %\textbf{Zusammenfassend}
meillo@28:   \paragraph{Zusammenfassung}
meillo@28:     \begin{itemize}
meillo@28:       \item Menschen denken basierend auf der Realität
meillo@28:       \item deshalb Design Patterns auf Realität zurückführen
meillo@28:       \item Patterns anwenden weil man es in der Realität auch so machen würde
meillo@28:     \end{itemize}
meillo@28:   
meillo@11: 
meillo@11: 
meillo@11: 
meillo@11: 
meillo@28:  Erklaerung des Vorgehens
meillo@28:  Frage: war es erfolgreich?
meillo@28:  \textbf{}
meillo@11: 
meillo@28:   \paragraph{}
meillo@28:   
meillo@11: 
meillo@11: 
meillo@11: 
meillo@28: \section{Abschließend}
meillo@28:   \paragraph{Verwendete Software}
meillo@11:   \begin{itemize}
meillo@11:     \item Debian GNU/Linux
meillo@11:     \item \LaTeX-Beamer und \texttt{pdflatex}
meillo@11:     \item Vim
meillo@11:     \item qiv und ImageMagick
meillo@11:     \item Mercurial
meillo@11:   \end{itemize}
meillo@28:   
meillo@11: 
meillo@28:   \paragraph{}
meillo@11:     \vspace{3ex}
meillo@11:     \centerline{\textbf{Danke für eure Aufmerksamkeit}}
meillo@28:   
meillo@11: 
meillo@11: 
meillo@11: 
meillo@11: 
meillo@11: 
meillo@11: 
meillo@11: 
meillo@28: \appendix
meillo@11: 
meillo@28: \section{Code}
meillo@28:  \textbf{Code? --- Nein, kein Code!}
meillo@28:   \paragraph{Denn}
meillo@28:     \begin{center}
meillo@28:     \textbf{ Implementierungen sind Schall und Rauch,\\
meillo@28:     Konzepte dagegen bleiben bestehen!  }
meillo@28:     \end{center}
meillo@28:   
meillo@28: 
meillo@28:   \vspace{4ex}
meillo@28:   {\scriptsize 
meillo@28:   \paragraph{}
meillo@28:     \textit{ Beispiel-Implementierung in der Ausarbeitung. }
meillo@28:   
meillo@28:   }
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@28: 
meillo@11: 
meillo@11: 
meillo@11: \end{document}




