
\begin{slide}{Besucher-Muster für Bäume}
\begin{verbatim}
interface Tree<K> { }
class Leaf<K>   implements Tree<K> { 
  Leaf(K key) { .. } }
class Branch<K> implements Tree<K> {
  Branch(Tree<K> left, Tree<K> right) { .. } }
\end{verbatim}
für jeden Teilnehmer des Kompositums eine Methode:
\begin{verbatim}
interface Visitor<K,R> { // mit Resultattyp R
    R leaf (K x);
    R branch (R left, R right);  }
\end{verbatim}
der Gastgeber (Baumknoten) nimmt Besucher auf:
\begin{verbatim}
interface Tree<K> {
  <R> R receive (Visitor<K,R> v) }
\end{verbatim}
\end{slide}

\begin{slide}{Beispiel: Baum-Besucher}
Benutzung des Besuchers: Anzahl der Blätter:
\begin{verbatim}
class Trees {
  static <K> int leaves (Tree<K> t) {
    return t.receive(new Tree.Visitor<K,Integer>() {
      public Integer branch
           (Integer left, Integer right) {
        return left + right;
      }
      public Integer leaf(K key) {
        return 1;
      }
    });
  }
}
\end{verbatim}


\end{slide}
