// Purpose. Iterator design pattern // Take traversal-of-a-collection functionality out of the collection and // promote it to "full object status". This simplifies the collection, allows // many traversals to be active simultaneously, and decouples collection algo- // rithms from collection data structures. // 1. Design an internal "iterator" class for the "collection" class // 2. Add a createIterator() member to the collection class // 3. Clients ask the collection object to create an iterator object // 4. Clients use the first(), isDone(), next(), and currentItem() protocol import java.util.*; class IntSet { private Hashtable ht = new Hashtable(); // 1. Design an internal "iterator" class for the "collection" class public static class Iterator { private IntSet set; private Enumeration e; private Integer current; public Iterator( IntSet in ) { set = in; } public void first() { e = set.ht.keys(); next(); } public boolean isDone() { return current == null; } public int currentItem() { return current.intValue(); } public void next() { try { current = (Integer) e.nextElement(); } catch (NoSuchElementException e) { current = null; } } } public void add( int in ) { ht.put( new Integer( in ), "null" ); } public boolean isMember( int i ) { return ht.containsKey(new Integer(i)); } public Hashtable getHashtable() { return ht; } // 2. Add a createIterator() member to the collection class public Iterator createIterator() { return new Iterator( this ); } } class IteratorDemo { public static void main( String[] args ) { IntSet set = new IntSet(); for (int i=2; i < 10; i += 2) set.add( i ); for (int i=1; i < 9; i++) System.out.print( i + "-" + set.isMember( i ) + " " ); // 3. Clients ask the collection object to create many iterator objects IntSet.Iterator it1 = set.createIterator(); IntSet.Iterator it2 = set.createIterator(); // 4. Clients use the first(), isDone(), next(), currentItem() protocol System.out.print( "\nIterator: " ); for ( it1.first(), it2.first(); ! it1.isDone(); it1.next(), it2.next() ) System.out.print( it1.currentItem() + " " + it2.currentItem() + " " ); // Java uses a different collection traversal "idiom" called Enumeration System.out.print( "\nEnumeration: " ); for (Enumeration e = set.getHashtable().keys(); e.hasMoreElements(); ) System.out.print( e.nextElement() + " " ); System.out.println(); } } // 1-false 2-true 3-false 4-true 5-false 6-true 7-false 8-true // Iterator: 8 8 6 6 4 4 2 2 // Enumeration: 8 6 4 2