terminal

codeando_simple

terminal

menu

terminal

search_module

guest@codeandosimple: ~/system/search $ grep -r "" .

Press [ENTER] to execute search

Status

Engine: Ready

Database: Online

Index: V2.1.0_LATEST

bash — cat iterator.md
guest@codeandosimple: ~/blog/design-patterns $ cat iterator.md

Patrón Iterator_

// "Nuestra mayor debilidad es rendirse; la única manera de tener éxito es intentar siempre una vez más" - Thomas A. Edison

# 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

Estructura UML Iterator

# 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.

Ejemplo Iterator

# 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.