Iterator pattern for container : Iterator Pattern « Design Pattern « Java Tutorial






import java.util.ArrayList;
import java.util.Iterator;

public class TestCorporation {
  public static void main(String args[]) {
    Corporation corporation = new Corporation();

    Division rnd = new Division("R&D");
    rnd.add(new VP("A", "R&D"));
    rnd.add(new VP("B", "R&D"));
    rnd.add(new VP("C", "R&D"));

    Division sales = new Division("Sales");

    sales.add(new VP("E", "Sales"));
    sales.add(new VP("F", "Sales"));
    sales.add(new VP("G", "Sales"));
    sales.add(new VP("F", "Sales"));

    Division western = new Division("Sales");
    western.add(new VP("W", "Sales"));
    western.add(new VP("Z", "Sales"));

    sales.add(western);

    VP vp = new VP("Cary", "At Large");

    corporation.add(rnd);
    corporation.add(sales);
    corporation.add(vp);

    corporation.print();
  }
}

class Corporation extends Corporate {
  private ArrayList<Corporate> corporate = new ArrayList<Corporate>();


  public Corporation() {
  }

  public void add(Corporate c) {
    corporate.add(c);
  }

  public void print() {
    Iterator iterator = corporate.iterator();

    while (iterator.hasNext()) {
      Corporate c = (Corporate) iterator.next();
      c.print();
    }
  }
}

abstract class Corporate {
  public String getName() {
    return "";
  }

  public void add(Corporate c) {
  }

  public Iterator iterator() {
    return null;
  }

  public void print() {
  }
}

class Division extends Corporate {
  private Corporate[] corporate = new Corporate[100];
  private int number = 0;
  private String name;

  public Division(String n) {
    name = n;
  }

  public String getName() {
    return name;
  }

  public void add(Corporate c) {
    corporate[number++] = c;
  }

  public Iterator iterator() {
    return new DivisionIterator(corporate);
  }

  public void print() {
    Iterator iterator = iterator();

    while (iterator.hasNext()) {
      Corporate c = (Corporate) iterator.next();
      c.print();
    }
  }
}

class VP extends Corporate {
  private String name;
  private String division;

  public VP(String n, String d) {
    name = n;
    division = d;
  }

  public String getName() {
    return name;
  }

  public void print() {
    System.out.println("Name: " + name + " Division: " + division);
  }

  public Iterator iterator() {
    return new VPIterator(this);
  }

}

class VPIterator implements Iterator {
  private VP vp;

  public VPIterator(VP v) {
    vp = v;
  }

  public VP next() {
    return vp;
  }

  public boolean hasNext() {
    return false;
  }

  public void remove() {
  }
}

class DivisionIterator implements Iterator {
  private Corporate[] corporate;
  private int location = 0;

  public DivisionIterator(Corporate[] c) {
    corporate = c;
  }

  public Corporate next() {
    return corporate[location++];
  }

  public boolean hasNext() {
    if (location < corporate.length && corporate[location] != null) {
      return true;
    } else {
      return false;
    }
  }

  public void remove() {
  }
}








34.13.Iterator Pattern
34.13.1.Iterator pattern for container