\begin{slide}{Muster: Besucher}

Klasse für Zahlenfolgen:
\begin{verbatim}
public class Zahlenfolge {

  private final List<Integer> contents;

  // Konstruktor mit variabler Argumentzahl
  public Zahlenfolge(Integer ... xs) {
          this.contents = new LinkedList<Integer>();
          this.contents.addAll(Arrays.asList(xs));
  }

  // TODO: wird delegiert
  public void add (int x) {  }

  // TODO: wird delegiert
  public String toString() {  }
  
  // TODO, soll Folge [ lo, lo + 1 .. hi - 1 ] erzeugen
  public static Zahlenfolge range (int lo, int hi) { }
}
\end{verbatim}
testen:
\begin{verbatim}
public class Main {
  public static void main(String[] args) {
    Zahlenfolge f = Zahlenfolge.range(0, 10);
    System.out.println (f);
  }
}
\end{verbatim}
Definition eines Besucher-Objektes (inneres Interface)
\begin{verbatim}
class Zahlenfolge { ...
  public interface Visitor {
    int empty();
    int nonempty(int previous_result, int element);
  }
}
\end{verbatim}
Behandlung eines Besuchers
\begin{verbatim}
class Zahlenfolge { ...
  public int visit(Visitor v) {
    int accu = v.empty();
    for (int x : this.contents) {
      accu = v.nonempty(accu, x);
    }
    return accu;
  }
}
\end{verbatim}
Beispiel:
\begin{verbatim}
public class Operation {
  static int summe (Zahlenfolge f) {
    return f.visit(new Zahlenfolge.Visitor() {
      public int empty() {
        return 0;
      }
      public int nonempty(int previous_result, int element) {
        return previous_result + element;
      }
    });             
  }
}
\end{verbatim}          
Aufgaben: schreibe ähnliche Methoden für
\begin{itemize}
\item Produkt
\item Minimum, Maximum
\item Wert als Binärzahl, Bsp:
\begin{verbatim}
Operation.binary (new Zahlenfolge(1,1,0,1)) ==> 13
\end{verbatim}
\end{itemize}

\end{slide}

\begin{slide}{Generischer Besucher}

Eigentlich soll ja auch das gehen,
\begin{verbatim}
Operation.contains (new Zahlenfolge(1,5,2,8), 2)) ==> true
\end{verbatim}
geht aber nicht, weil der Rückgabewert bisher auf int fixiert ist.

Lösung der Rückgabetyp wird ein Parameter:
\begin{verbatim}
class Zahlenfolge { ...
  public interface Visitor<R> {
    R empty();
    R nonempty(R previous_result, int element);
  }
}
\end{verbatim}
Behandlung eines Besuchers
\begin{verbatim}
class Zahlenfolge { ...
  public <R> R visit(Visitor<R> v) {
    R accu = v.empty();
    for (int x : this.contents) {
      accu = v.nonempty(accu, x);
    }
    return accu;
  }
}
\end{verbatim}
Beispiel:
\begin{verbatim}
public class Operation {
  static boolean contains (Zahlenfolge f, int x) {
    return f.visit(new Zahlenfolge.Visitor<Boolean>() {
      public Boolean empty() { return false; }
      ...
  }
}
\end{verbatim}
\end{slide}

\begin{slide}{Besucher für Bäume}

(dieses Beispiel sinngemäß aus: 
Naftalin, Wadler: Java Generics and Collections, O'Reilly 2006.)

binäre Bäume mit:
\begin{itemize}
\item Blatt enthält Schlüssel
\item innerer Knoten hat zwei Kinder (aber selbst keinen Schlüssel)
\end{itemize}

(Wdhlg. Kompositum)
\begin{verbatim}
interface Tree<K> { }
class Branch<K> implements Tree<K> {
    Tree<K> left; Tree<K> right;
}
class Leaf<K> implements Tree<K> {
    K key;
}
\end{verbatim}
Aufgabe: Konstruktoren, toString, Testmethode
\begin{verbatim}
class Trees {
    // vollst. bin. Baum der Höhe h
    static Tree<Integer> full (int h);
}
System.out.println (Trees.full(1))
   ==> Branch{left=Leaf{key=0},right=Leaf{key=0}}
\end{verbatim}
Besucher (mit Resultattyp R, für Bäume mit Schlüsseltyp K)
\begin{verbatim}
interface Tree<K> {
  interface Visitor<K, R> {
    R leaf (K key);
    R branch (R left, R right);
  }
  <R> R visit (Visitor<K,R> v);
}
\end{verbatim}
Aufgabe: implementiere visit in Branch und Leaf

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

Hinweis: am 1. 5. keine Vorlesung (Feiertag),
am 2. 5. nur eine Übung (9:30) zu Fragen zu Entwurfsmustern.

\end{slide}



%%% Local Variables: 
%%% mode: latex
%%% TeX-master: t
%%% End: 
