% @file
% @brief   Referat DesignPatterns `Composite'
% @author  dimitar dimitrov
% @since   2007-06-18


\documentclass{beamer}

  \usepackage[utf8]{inputenc}
  \usepackage{ngerman}
  \usepackage{graphicx}
  \usepackage[automark]{scrpage2}
  \usepackage{listings}
  \input{Style01}



\begin{document}


\title{Composite-Pattern}
\author{Dimitar Dimitrov}
\date{}

%\titlegraphic{\includegraphics[width=3cm]{Pics/Maka-Logo.png}}

\frame{
  \titlepage
}





\section[Outline]{}
\frame{ \frametitle{Outline}
  \tableofcontents
}




\section{Definition}

\frame{ \frametitle{Definition}

  \begin{block}{Definition}
    \begin{itemize}
      \item Organisiert Objekte in Baumstrukturen für die Repräsentation von Teil-Ganzes-Beziehungen
      \item Erlaubt den gleichförmigen Zugriff auf atomare Einzelobjekte wie auf zusammengesetzte Objekte
    \end{itemize}
  \end{block}

  \begin{block}{Beispiel Telefonnummer}
    0800-CAR-TALK

    0800-227-8255
  \end{block}

}


\section{Motivation}

\frame{ \frametitle{Motivation}

  \begin{block}{Beispiel Grafikprogramm}
    \begin{itemize}
      \item Einfache Objekte (Primitive) wie Linien und Texte sollen gruppierbar sein; der Benutzer möchte Gruppen genau wie Einzelobjekte behandeln
      \item Implementierungsidee: Klassen für Primitive + Klassen für Container
      \item Diese Unterscheidung macht den Programmcode sehr komplex
    \end{itemize}
  \end{block}

  \begin{block}{Lösung}
    \begin{itemize}
      \item Eine abstrakte Oberklasse repräsentiert Primitive und Container
      \item Operationen von Primitiven werden von Containerobjekten an die enthaltenen Objekte delegiert
    \end{itemize}
  \end{block}

}


\section{Wann verwenden?}
\frame{ \frametitle{Wann verwenden?}

  \begin{itemize}
    \item Wenn Teil-/Ganzes-Hierarchien von Objekten zu repräsentieren sind
    \item Wenn Anwendungsklassen den Unterschied zwischen atomaren und zusammengesetzten Objekten ignorieren sollen
  \end{itemize}

}



\section{Struktur}

\frame{ \frametitle{UML-Diagramm des Composite-Pattern}
  \centerline{ \includegraphics[width=20em]{pics/composite_big.png} }
}

\frame{ \frametitle{Beteiligte}
  
  \begin{block}{Component}
    Definiert die gemeinsame Schnittstelle aller Objekte im Baum Implementiert Default-Verhalten, wo möglich und sinnvoll
    Definiert eine Schnittstelle für den Zugriff auf Kinder einer Komponente
  \end{block}

  \begin{block}{Leaf}
    Repräsentiert Blätter in der Baumhierarchie
    Definiert das Verhalten von atomaren Objekten
  \end{block}

  \begin{block}{Composite}
    Repräsentiert Wurzel- und innere Knoten in der Baumhierarchie
    Definiert das Verhalten dieser Knoten
    Implementiert Kind-bezogene Operationen
  \end{block}

  \begin{block}{Client}
    manipuliert Objekte mittels Component-Schnittstelle
  \end{block}
}





\section{Java-Beispiel}
\subsection{main, IComponent}
\frame{ \frametitle{class Main, interface IComponent}

  {\tiny
    \lstinputlisting[language=java]{code/composite-main.java}
    \lstinputlisting[language=java]{code/composite-icomponent.java}
  }

}


\subsection{Composite}
\frame{ \frametitle{class Composite}

  {\tiny
    \lstinputlisting[language=java]{code/composite-composite.java}
  }

}


\subsection{Leaf}
\frame{ \frametitle{class Leaf}

  {\tiny
    \lstinputlisting[language=java]{code/composite-leaf.java}
  }

}




\section{Zusammenfassung}
\frame{
  \begin{block}{Zusammenfassung}
  \begin{itemize}
    \item Definiert Klassenhierarchien bestehend aus atomaren Objekten (Primitiven) und zusammengesetzten Objekten Verbirgt den Unterschied zwischen diesen Objekten vor Anwendungsklassen

    \item Vereinfacht Anwendungsklassen (viele Fallunterscheidungen entfallen)

    \item Macht es einfach, neue Arten von Komponenten hinzuzufügen;

    \item Anwendungsklassen funktionieren ohne Änderung. Macht das Design vielleicht "allgemeiner" als gewünscht; falls nur bestimmte Klassen in ein bestimmtes Composite aufgenommen werden sollen, sind dafür Laufzeitüberprüfungen notwendig
  \end{itemize}
  \end{block}
}



\end{document}
