¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Patrones de diseño en C#
  3. El patrón Iterator
Extrait - Patrones de diseño en C# Los 23 modelos de diseño: descripción y soluciones ilustradas en UML 2 y C# [2ªedición]
Extractos del libro
Patrones de diseño en C# Los 23 modelos de diseño: descripción y soluciones ilustradas en UML 2 y C# [2ªedición] Volver a la página de compra del libro

El patrón Iterator

Descripción

El patrón Iterator proporciona un acceso secuencial a una colección de objetos a los clientes sin que éstos tengan que preocuparse de la implementación de esta colección.

Ejemplo

Queremos proporcionar un acceso secuencial a los vehículos que componen el catálogo. Para ello, podemos implementar en la clase del catálogo los siguientes métodos:

  • inicio: inicializa el recorrido por el catálogo.

  • item: reenvía el vehículo en curso.

  • siguiente: pasa al vehículo siguiente.

Esta técnica presenta dos inconvenientes:

  • Hace aumentar de manera inútil la clase catálogo.

  • Sólo permite recorrer el catálogo una vez, lo cual puede ser insuficiente (en especial en el caso de aplicaciones multitarea).

El patrón Iterator proporciona una solución a este problema. La idea consiste en crear una clase Iterador donde cada instancia pueda gestionar un recorrido en una colección. Las instancias de esta clase Iterador las crea la clase colección que se encarga de inicializarlas.

El objetivo del patrón Iterator es proporcionar una solución que pueda ser configurada según el tipo de elementos que componen la colección. Presentamos por tanto dos clases abstractas genéricas:

  • Iterador es una clase abstracta genérica que incluye los métodos inicioitem y siguiente;

  • Catálogo es a su vez una clase abstracta genérica que incluye los métodos que crean, inicializan y devuelven una instancia de Iterador.

A continuación es posible crear las subclases concretas de estas dos clases abstractas genéricas...

Estructura

1. Diagrama de clases

La figura 4-5.2 detalla la estructura genérica del patrón, que es muy parecida al diagrama de clases de la figura 4-5.1.

images/figure21-2.png

Figura 4-5.2 - Estructura del patrón Iterator

2. Participantes

Los participantes del patrón son los siguientes:

  • Iterador es la clase abstracta que implementa la asociación del iterador con los elementos de la colección así como los métodos. Es genérica y está parametrizada mediante el tipo TElemento;

  • IteradorConcreto (IteradorVehículo) es una subclase concreta de Iterador que relaciona TElemento con ElementoConcreto;

  • Colección (Catálogo) es la clase abstracta que implementa la asociación de la colección con los elementos y el método creaIterador;

  • ColecciónConcreta (CatálogoVehículo) es una subclase concreta de Colección que relaciona TElemento con ElementoConcreto y TIterador con IteradorConcreto;

  • Elemento es la clase abstracta de los elementos de la colección;

  • ElementoConcreto (Vehículo) es una subclase concreta de Elemento utilizada por IteradorConcreto y ColecciónConcreta.

3. Colaboraciones

El iterador guarda en memoria el objeto en curso en la colección. Es capaz de calcular el objeto siguiente del recorrido.

Dominios de aplicación

El patrón se utiliza en los casos siguientes:

  • Es necesario realizar un recorrido de acceso al contenido de una colección sin acceder a la representación interna de esta colección.

  • Debe ser posible gestionar varios recorridos de forma simultánea.

Ejemplo en C#

Presentamos a continuación un ejemplo escrito en C# del recorrido del catálogo de vehículos con ayuda de un iterador.

El código fuente de la clase abstracta Elemento se muestra a continuación. Los elementos poseen una descripción. El método palabraClaveValida verifica si aparece cierta palabra clave en la descripción.

using System; 
 
public abstract class Elemento 
{ 
    protected string descripcion; 
 
    public Elemento(string descripcion) 
    { 
        this.descripcion = descripcion; 
    } 
 
    public bool palabraClaveValida(string palabraClave) 
    { 
        return descripcion.IndexOf(palabraClave) != -1; 
    } 
} 

La subclase concreta Vehiculo incluye un método visualiza.

using System; 
 
public class Vehiculo : Elemento 
{ 
 
    public Vehiculo(string descripcion) : base(descripcion) { } 
 
    public void visualiza() 
    { 
        Console.WriteLine("Descripción del vehículo: " + 
            descripcion); 
    } 
}...