# Propósito
El patrón Iterator (Iterador) brinda una manera de acceder a los elementos de un objeto agregado de forma secuencial, sin exponer su representación interna.
# Problema
Necesidad de recorrer colecciones (arrays, listas, árboles) de manera uniforme sin importar su estructura interna.
# Solución
Utilizar un objeto iterador que encapsula la navegación. Esto separa la lógica de recorrido de la lógica de negocio.
# Estructura
# Participantes
- Iterator: Interfaz para el recorrido.
- ConcreteIterator: Mantiene la posición actual.
- Aggregate: Interfaz para crear el iterador.
- ConcreteAggregate: Retorna el iterador correspondiente.
- Client: Usa el iterador para el recorrido.
# Cuándo Usarlo
-
Ocultar representación interna de la colección.
-
Soportar múltiples formas de recorrido.
# Ventajas
-
verified
Separación: Lógica de navegación externa a la colección.
-
verified
Uniformidad: Acceso idéntico a diferentes colecciones.
# Desventajas
-
warning
Complejidad: Capas adicionales de abstracción.
-
warning
Rendimiento: Sobrecarga frente al acceso directo.
# Ejemplo: Libro de Recetas Digital
Navegar pasos de una receta secuencialmente (adelante/atrás) sin exponer cómo se almacenan.
# Código Java
interface Iterator { boolean hasNext(); Object next(); }
class RecipeIterator implements Iterator {
private String[] steps;
private int pos = 0;
public boolean hasNext() { return pos < steps.length; }
public Object next() { return steps[pos++]; }
}
class Recipe implements Aggregate {
public Iterator createIterator() { return new RecipeIterator(steps); }
}
# Mapeo Participantes
- RecipeIterator: ConcreteIterator.
- Recipe: ConcreteAggregate.
- CookbookApp: Client.
# Conclusiones
Brinda gran flexibilidad para modificar la estructura de datos interna sin impactar el código cliente que la recorre.
# Patrones relacionados
Composite
Para recorrer estructuras jerárquicas complejas.
Factory Method
Para instanciar el iterador adecuado al agregado.