💡 Ver Caso Práctico: Ejemplo Práctico del Patrón Iterator
Iterator (Iterador) es un patrón de diseño comportamental que permite recorrer los elementos de una colección sin exponer su representación subyacente (lista, pila, árbol, grafo).
Propósito y Caso de Uso
Utiliza Iterator cuando quieras ofrecer una forma uniforme de recorrer distintas estructuras de datos (un array, un árbol de categorías, un stream paginado de una API) sin que el cliente conozca los detalles internos de cada una. También permite tener varios recorridos simultáneos e independientes sobre la misma colección.
Estructura del Patrón
- Iterador (Interfaz): Declara métodos para recorrer la colección (
hasNext(),next()). - Iterador Concreto: Implementa el recorrido específico y mantiene el estado de la posición actual.
- Colección Iterable: Expone un método (
createIterator()) que devuelve un nuevo iterador sobre sí misma.
Flujo de Funcionamiento
- Creación: El cliente pide a la colección un iterador nuevo.
- Recorrido: El cliente llama repetidamente a
hasNext()/next()sin conocer si es un array, árbol o lista enlazada. - Independencia: Cada iterador mantiene su propio puntero, permitiendo recorridos paralelos sobre la misma colección.
Ejemplos de Implementación Reales
interface Iterator<T> {
hasNext(): boolean;
next(): T;
}
class CategoryTreeIterator implements Iterator<string> {
private stack: CategoryNode[];
constructor(root: CategoryNode) { this.stack = [root]; }
hasNext(): boolean { return this.stack.length > 0; }
next(): string {
const node = this.stack.pop()!;
this.stack.push(...node.children); // Recorrido en profundidad (DFS)
return node.name;
}
}
class CategoryNode {
children: CategoryNode[] = [];
constructor(public name: string) {}
createIterator(): Iterator<string> { return new CategoryTreeIterator(this); }
}
const root = new CategoryNode('design-patterns');
const it = root.createIterator();
while (it.hasNext()) console.log(it.next());Cuándo NO usarlo
Si la colección es un simple array y ya cuentas con iteradores nativos del lenguaje (for...of, foreach, comprensiones), crear un iterador propio es redundante (YAGNIGlosarioYAGNI (You Aren't Gonna Need It)Principio de Extreme Programming (XP) que establece que un programador no debe añadir funcionalidad hasta que sea estrictamente necesario. Su objetivo es evitar la sobre-ingeniería (over-engineering), previniendo código para funcionalidades hipotéticas.Ver término completo →).