Iterator
Intent
Provide a way to access the elements of an aggregate object
sequentially without exposing its underlying representation.
Problem
Need to "abstract" the traversal of wildly different data structures
so that algorithms can be defined that are capable of interfacing with
each transparently.
Discussion
"An aggregate object such as a list should give you a way to access
its elements without exposing its internal structure. Moreover, you
might want to traverse the list in different ways, depending on what
you need to accomplish. But you probably don't want to bloat the List
interface with operations for different traversals, even if you
could anticipate the ones you'll require. You might also need to have
more than one traversal pending on the same list." [GOF, p257] And,
providing a uniform interface for traversing many types of aggregate
objects (i.e. polymorphic iteration) might be valuable.
The Iterator pattern lets you do all this. The key idea is to take the
responsibility for access and traversal out of the aggregate object
and put it into an Iterator object that defines a standard traversal
protocol.
The Iterator abstraction is fundamental to an emerging technology
called "generic programming". This strategy seeks to explicitly
separate the notion of "algorithm" from that of "data structure". The
motivation is to: promote component-based development, boost
productivity, and reduce configuration management.
As an example, if you wanted to support four data structures (array,
binary tree, linked list, and hash table) and three algorithms (sort,
find, and merge), a traditional approach would require four times three
permutations to develop and maintain. Whereas, a generic programming
approach would only require four plus three configuration items.
Structure
Example
The Iterator provides ways to access elements of an aggregate object
sequentially without exposing the underlying structure of the object.
Files are aggregate objects. In office settings where access to files
is made through administrative or secretarial staff, the Iterator
pattern is demonstrated with the secretary acting as the Iterator.
Several television comedy skits have been developed around the premise
of an executive trying to understand the secretary's filing system. To
the executive, the filing system is confusing and illogical, but the
secretary is able to access files quickly and efficiently. [Michael
Duell, "Non-software examples of software design patterns",
Object Magazine, Jul 97, p54]
Non-software example
Rules of thumb
The abstract syntax tree of Interpreter is a Composite (therefore
Iterator and Visitor are also applicable). [GOF, p255]
Iterator can traverse a Composite. Visitor can apply an operation over
a Composite. [GOF, p173]
Polymorphic Iterators rely on Factory Methods to instantiate the
appropriate Iterator subclass. [GOF, p271]
Memento is often used in conjunction with Iterator. An Iterator can use
a Memento to capture the state of an iteration. The Iterator stores the
Memento internally. [GOF, p271]
C++ Demos | Java
Demos | Lab