Muster: Besucher

Klasse für Zahlenfolgen:

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) { }
}
testen:
public class Main {
  public static void main(String[] args) {
    Zahlenfolge f = Zahlenfolge.range(0, 10);
    System.out.println (f);
  }
}
Definition eines Besucher-Objektes (inneres Interface)
class Zahlenfolge { ...
  public interface Visitor {
    int empty();
    int nonempty(int previous_result, int element);
  }
}
Behandlung eines Besuchers
class Zahlenfolge { ...
  public int visit(Visitor v) {
    int accu = v.empty();
    for (int x : this.contents) {
      accu = v.nonempty(accu, x);
    }
    return accu;
  }
}
Beispiel:
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;
      }
    });             
  }
}



Johannes Waldmann 2008-06-18