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 inicio, item 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.
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 Java
Presentamos a continuación un ejemplo escrito en Java 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.
public abstract class Elemento
{
protected String descripcion;
public Elemento(String descripcion)
{
this.descripcion = descripcion;
}
public boolean palabraClaveValida(String palabraClave)
{
return descripcion.indexOf(palabraClave) != -1;
}
}
La subclase concreta Vehiculo incluye un método visualiza.
public class Vehiculo extends Elemento
{
public Vehiculo(String descripcion)
{
super(descripcion);
}
public void visualiza()
{
System.out.print("Descripcion del vehículo: " +
descripcion);
}
}
La clase Iterador incluye los métodos inicio, siguiente, item así como el método setPalabraClaveConsulta...