import java.util.*; public class IteratorTest1 { public static void main(String[] args) { ConcreteAggregate a = new ConcreteAggregate(); a.set(0,"大鸟"); a.set(1,"小蔡"); a.set(2,"行李"); a.set(3,"老外"); a.set(4,"公交内部工作员"); a.set(5,"小偷"); Iterator i = new ConcreteIterator(a); Object item = i.First(); while(!i.IsDone()) { System.out.println(""+i.CurrentItem()+"请买车票"); i.Next(); } System.out.println(); Iterator i2 = new ConcreteIteratorDesc(a); Object item2 = i2.First(); while(!i2.IsDone()) { System.out.println(""+i2.CurrentItem()+"请买车票"); i2.Next(); } System.out.println(); } } abstract class Iterator { abstract public Object First(); abstract public Object Next(); abstract public boolean IsDone(); abstract public Object CurrentItem(); } abstract class Agreegate { public abstract Iterator CreateIterator(); } class ConcreteIterator extends Iterator { private ConcreteAggregate aggregate; private int current = 0; public ConcreteIterator(ConcreteAggregate aggregate) { this.aggregate = aggregate; } public Object First() { return aggregate.get(0); } public Object Next() { Object ret = null; current++; if(current < aggregate.Count()) { ret = aggregate.get(current); } return ret; } public boolean IsDone() { return current >= aggregate.Count() ? true : false; } public Object CurrentItem() { return aggregate.get(current); } } class ConcreteAggregate extends Agreegate { private List<Object> items = new ArrayList<Object>(); public Iterator CreateIterator() { return new ConcreteIterator(this); } public int Count() { return items.size(); } public Object get(int index) { return items.get(index); } public void set(int index,Object e) { items.add(index,e); } } class ConcreteIteratorDesc extends Iterator { private ConcreteAggregate aggregate; private int current = 0; public ConcreteIteratorDesc(ConcreteAggregate aggregate) { this.aggregate = aggregate; current = aggregate.Count() - 1; } public Object First() { return aggregate.get(aggregate.Count() - 1); } public Object Next() { Object ret = null; current--; if(current >= 0) { ret = aggregate.get(current); } return ret; } public Object CurrentItem() { return aggregate.get(current); } public boolean IsDone() { return current < 0 ? true : false; } }