Patrón Iterator

[ Arquitectura  ]

El patrón iterator nos proporciona un mecanismo para recorrer colecciones de objetos de forma secuencial sin tener conocimiento de cómo están implementadas estas colecciones.

Vamos con el ejemplo:

public abstract class Item
{
    protected string _descripcion;

    protected Item(string descripcion)
    {
        _descripcion = descripcion;
    }

    public bool PalabraClaveValida(string palabraClave) 
        => _descripcion.IndexOf(palabraClave, StringComparison.Ordinal) != -1;

}

public class BookIterator : Item
{
    public BookIterator(string descripcion) : base(descripcion) { }

    public void Visualiza() 
        => Console.WriteLine($"Descripción del Libro: { _descripcion}");
}

public abstract class Iterador<TItem> where TItem : Item
{
    public string palabraClaveConsulta { protected get; set; }
    protected int indice;
    public IList<TItem> contenido { protected get; set; }

    public void Inicio()
    {
        indice = 0;
        int length = contenido.Count;
        while (indice < length && !contenido[indice].PalabraClaveValida(palabraClaveConsulta)) {
            indice++;
        }
    }

    public void Siguiente()
    {
        int length = contenido.Count;
        indice++;
        while (indice < length && !contenido[indice].PalabraClaveValida(palabraClaveConsulta)) {
            indice++;
        }
    }

    public TItem item()
    {
        return indice < contenido.Count ? contenido[indice] : null;
    }
}

public class IteradorBook : Iterador<BookIterator> { }

public abstract class Catalogo<TElemento, TIterador>
    where TElemento : Item
    where TIterador : Iterador<TElemento>, new()
{
    protected IList<TElemento> contenido = new List<TElemento>();

    public TIterador Busqueda(string palabraClaveConsulta)
    {
        TIterador resultado = new TIterador
        {
            contenido = contenido,
            palabraClaveConsulta = palabraClaveConsulta
        };

        return resultado;
    }
}

public class CatalogoBook : Catalogo<BookIterator, IteradorBook>
{
    public CatalogoBook()
    {
        contenido.Add(new BookIterator("Libro PDF"));
        contenido.Add(new BookIterator("Gran libro en PDF"));
        contenido.Add(new BookIterator("Libro de gran calidad"));
    }
}

public class Usuario {
    static void Main(string[] args) {
        CatalogoBook catalogo = new CatalogoBook();
        IteradorBook iterador = catalogo.Busqueda("PDF");
        BookIterator libro;
        iterador.Inicio();
        libro = iterador.item();
        while (libro != null)
        {
            libro.Visualiza();
            iterador.Siguiente();
            libro = iterador.item();
        }
    }
}

Descripción del Libro: Libro PDF Descripción del Libro: Gran libro en PDF

Hasta la próxima.




@2017/@2024 - JRRN