Iterator Design Pattern
Video Lecture
Section | Video Links |
---|---|
Iterator Pattern | |
Iterator Use Case |
Overview
The Iterator will commonly contain two methods that perform the following concepts.
- next: returns the next object in the aggregate (collection, object).
- hasNext: returns a Boolean indicating if the Iterable is at the end of the iteration or not.
The benefits of using the Iterator pattern are that the client can traverse a collection of aggregates(objects) without needing to understand their internal representations and/or data structures.
Terminology
- Iterator Interface: The Interface for an object to implement.
- Concrete Iterator: (Iterable) The instantiated object that implements the iterator and contains a collection of aggregates.
- Aggregate Interface: An interface for defining an aggregate (object).
- Concrete Aggregate: The object that implements the Aggregate interface.
Iterator UML Diagram
Source Code
In this concept example, I create 4 objects called Aggregate and group them into a collection.
They are very minimal objects that implement one method that prints a line.
I then create an Iterable and pass in the collection of Aggregates.
I can now traverse the aggregates through the Iterable interface.
./src/iterator/iterator-concept.ts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
|
Output
node ./dist/iterator/iterator-concept.js
This method has been invoked
This method has been invoked
This method has been invoked
This method has been invoked
SBCODE Editor
Iterator Use Case
The iterator in this brief example will return the next number in the iterator multiplied by 2 modulus 11. It dynamically creates the returned object (number) at runtime.
It has no hasNext()
method since the result is modulated by 11, that will loop the results no matter how large the iterator index is. Furthermore, it will also appear to alternate between a series of even numbers and odd numbers.
Also, just to demonstrate that implementing abstract classes and interfaces is not always necessary, this example uses no abstract base classes or interfaces.
Example UML Diagram
Source Code
./src/iterator/client.ts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
Output
node ./dist/iterator/client.js
2 4 6 8 10 1 3 5 7 9 0 2 4 6 8 10 1 3 5 7 9 0
SBCODE Editor
Summary
- Use an iterator when you need to traverse over a collection, or you want an object that can output a series of dynamically created objects.
- At minimum, an iterator needs a
next
equivalent method that returns an object. - Optionally you can also create a helper function that indicates whether an iterator is at the end or not. This is useful if you use your iterator in a
while
loop.