F R A N C I S C O J AV I E R D E L A R O S A G Ó M E Z 1810165 PROPÓSITO
• Es un mecanismo de acceso a los elementos que constituyen una estructura de
datos para la utilización de estos sin exponer su estructura interna MOTIVACIÓN • Surge del deseo de acceder a los elementos de un contenedor de objetos (por ejemplo, una lista) sin exponer su representación interna. • La solución que propone es añadir métodos que permitan recorrer la estructura sin referenciar explícitamente su representación. La responsabilidad del recorrido se traslada a un objeto iterador. • El problema de introducir este objeto iterador reside en que los clientes necesitan conocer la estructura para crear el iterador apropiado. • Esto se soluciona generalizando los distintos iteradores en una abstracción y dotando a las estructuras de datos de un método de fabricación que cree un iterador concreto. APLICABILIDAD
• Permite el acceso al contenido de una estructura sin exponer su representación
interna. Además diferentes iteradores pueden presentar diferentes tipos de recorrido sobre la estructura (recorrido de principio a fin, recorrido con saltos...) • Por otro lado los iteradores no tienen por qué limitarse a recorrer la estructura, sino que podrían incorporar otro tipo de lógica (por ejemplo, filtrado de elementos). • Es más, dados diferentes tipos de estructuras, el patrón iterador permite recorrerlas todas utilizando una interfaz común uniforme. PARTICIPANTES • Iterador (Iterator) define la interfaz para recorrer el agregado de elementos y acceder a ellos, de manera que el cliente no tenga que conocer los detalles y sea capaz de manejarlos de todos modos. • Iterador Concreto (ConcreteIterator) implementa la interfaz propuesta por el Iterador. Es el que se encarga de mantener la posición actual en el recorrido de la estructura. • Agregado (Aggregate) define la interfaz para el método de fabricación de iteradores. • Agregado Concreto (ConcreteAggregate) implementa la estructura de datos y el método de fabricación de iteradores que crea un iterador específico para su estructura. COLABORACIONES Y • Un iterador concreto es el encargado CONSECUENCIAS de guardar la posición actual dentro de la estructura de datos, interactuando con esta para calcular el siguiente elemento del recorrido. • El patrón Iterador permite por tanto diferentes tipos de recorrido de un agregado y varios recorridos simultáneos, simplificando la interfaz del agregado. public class Vector2 { public int[] _datos; public Vector2(int valores){ _datos = new int[valores]; for (int i = 0; i < _datos.length; i++){ _datos[i] = 0; } } public int getValor(int pos){ return _datos[pos]; } public void setValor(int pos, int valor){ _datos[pos] = valor; } public int dimension(){ return _datos.length; } public IteradorVector iterador(){ return new IteradorVector(this); } } public class IteradorVector{ private int[] _vector; private int _posicion;
public IteradorVector(Vector2 vector){
_vector = vector._datos; _posicion = 0; }
public boolean hasNext(){
if (_posicion < _vector.length) return true; else return false; }
public Object next(){
int valor = _vector[_posicion]; _posicion++; return valor; } } public static void main(String argv[]) { Vector2 vector = new Vector2(5);
//Creación del iterador
IteradorVector iterador = vector.iterador();
//Recorrido con el iterador
while (iterador.hasNext()) System.out.println(iterador.next()); }