Iterator

Recorre los elementos de una colección sin exponer su representación interna.

Contexto

Tu colección es un árbol/grafo/stream, y quieres permitir varios tipos de recorrido (DFS, BFS) sin exponer la estructura.

Problema

Si el cliente recorre la estructura, queda acoplado a su representación.

Solución

Encapsula el recorrido en un iterador que avanza paso a paso.

#Ejemplo en C#

public class TreeNode<T>
{
    public T Value { get; set; } = default!;
    public List<TreeNode<T>> Children { get; } = new();

    public IEnumerable<T> DepthFirst()        // iterador C# con yield
    {
        yield return Value;
        foreach (var c in Children)
            foreach (var v in c.DepthFirst())
                yield return v;
    }
}

En C#, IEnumerable<T> + yield return es el patrón Iterator.

Cuándo NO aplicarlo

Cuando la estructura es trivial (List<T>) y foreach ya basta.

#behavioral #gof