Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.

Namespace separation of ConcreteAggregate and ConcreteIterator.

module aggregate {
define class Aggregate {
define abstract Iterator createIterator();
}
define class Iterator {
define abstract void first();
define abstract void next();
define abstract boolean isDone();
define abstract Object currentItem();
}
define class ConcreteAggregate extends Aggregate {
}
define class ConcreteIterator extends Iterator {
}
}
module aggregate.implementation extends aggregate {
class ConcreteAggregate {
Iterator createIterator() {...}
}
class ConcreteIterator {
// accessible to ConcreteAggregate directly.
void first() {...}
void next() {...}
boolean isDone() {...}
Object currentItem() {...}
}
}