In
object-oriented programming
Object-oriented programming (OOP) is a programming paradigm based on the concept of '' objects''. Objects can contain data (called fields, attributes or properties) and have actions they can perform (called procedures or methods and impl ...
, the iterator pattern is a
design pattern
A design pattern is the re-usable form of a solution to a design problem. The idea was introduced by the architect Christopher Alexander and has been adapted for various other disciplines, particularly software engineering. The " Gang of Four" ...
in which an
iterator
In computer programming, an iterator is an object that progressively provides access to each item of a collection, in order.
A collection may provide multiple iterators via its interface that provide items in different orders, such as forwards ...
is used to traverse a
container
A container is any receptacle or enclosure for holding a product used in storage, packaging, and transportation, including shipping.
Things kept inside of a container are protected on several sides by being inside of its structure. The term ...
and access the container's elements. The iterator pattern decouples
algorithm
In mathematics and computer science, an algorithm () is a finite sequence of Rigour#Mathematics, mathematically rigorous instructions, typically used to solve a class of specific Computational problem, problems or to perform a computation. Algo ...
s from containers; in some cases, algorithms are necessarily container-specific and thus cannot be decoupled.
For example, the hypothetical algorithm ''SearchForElement'' can be implemented generally using a specified type of iterator rather than implementing it as a container-specific algorithm. This allows ''SearchForElement'' to be used on any container that supports the required type of iterator.
Overview
The Iterator
design pattern is one of the 23 well-known
''
"Gang of Four" design patterns''
that describe how to solve recurring design problems to design flexible and reusable object-oriented software, that is, objects that are easier to implement, change, test, and reuse.
What problems can the Iterator design pattern solve?
* The elements of an aggregate object should be accessed and traversed without exposing its representation (data structures).
* New traversal operations should be defined for an aggregate object without changing its interface.
Defining access and traversal operations in the aggregate interface is inflexible because it commits the aggregate to particular access and traversal operations and makes it impossible to add new operations
later without having to change the aggregate interface.
What solution does the Iterator design pattern describe?
* Define a separate (iterator) object that encapsulates accessing and traversing an aggregate object.
* Clients use an iterator to access and traverse an aggregate without knowing its representation (data structures).
Different iterators can be used to access and traverse an aggregate in different ways.
New access and traversal operations can be defined independently by defining new iterators.
See also the UML class and sequence diagram below.
Definition
The essence of the Iterator Pattern is to "Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.".
Structure
UML class and sequence diagram
In the above
UML class diagram
In software engineering,
a class diagram
in the Unified Modeling Language (UML) is a type of static structure diagram that describes the structure of a system by showing the system's classes, their attributes, operations (or methods), and the re ...
, the
Client
class refers (1) to the
Aggregate
interface for creating an
Iterator
object (
createIterator()
) and (2) to the
Iterator
interface for traversing an
Aggregate
object (
next(),hasNext()
).
The
Iterator1
class implements the
Iterator
interface by accessing the
Aggregate1
class.
The
UML sequence diagram
In software engineering, a sequence diagram
shows process interactions arranged in time sequence. This diagram depicts the processes and objects involved and the sequence of messages exchanged as needed to carry out the functionality. Sequence ...
shows the run-time interactions: The
Client
object calls
createIterator()
on an
Aggregate1
object, which creates an
Iterator1
object and returns it
to the
Client
.
The
Client
uses then
Iterator1
to traverse the elements of the
Aggregate1
object.
UML class diagram
Example
Some languages standardize syntax. C++ and Python are notable examples.
C++
C++ implements iterators with the semantics of
pointers in that language. In C++, a class can overload all of the pointer operations, so an iterator can be implemented that acts more or less like a pointer, complete with dereference, increment, and decrement. This has the advantage that C++ algorithms such as
std::sort
can immediately be applied to plain old memory buffers, and that there is no new syntax to learn. However, it requires an "end" iterator to test for equality, rather than allowing an iterator to know that it has reached the end. In C++ language, we say that an iterator models the iterator
concept
A concept is an abstract idea that serves as a foundation for more concrete principles, thoughts, and beliefs.
Concepts play an important role in all aspects of cognition. As such, concepts are studied within such disciplines as linguistics, ...
.
This C++11 implementation is based on chapter "Generalizing vector yet again".
#include
#include
#include
class Vector ;
int main()
The program output is
1.21
4.84
1.21
4.84
1.21
4.84
terminate called after throwing an instance of 'std::out_of_range'
what(): Vector::operator[]
See also
* Composite pattern
* Container (data structure)
* Design pattern (computer science)
* Iterator
* Observer pattern
References
External links
Object iterationin PHP
Iterator Patternin C#
Iterator pattern in UML and in LePUS3 (a formal modelling language)SourceMaking tutorialIterator Pattern
{{Design Patterns Patterns
Articles with example C++ code
Articles with example C Sharp code
Articles with example JavaScript code
Articles with example Perl code
Articles with example PHP code
Iteration in programming
Software design patterns