Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Resumen
El patrón Iterator permite a objetos clientes acceder al contenido de un contenedor de manera
secuencial, sin tener conocimiento acerca de la representación interna de su contenido.
Descripción
El patrón Iterator permite a objetos clientes acceder al contenido de un contenedor de manera
secuencial, sin tener conocimiento acerca de la representación interna de su contenido.
El término contenedor, se define como una colección de datos u objetos. Los objetos con el contenedor
a su vez podrían ser colecciones, por lo que es una colección de colecciones. El patrón Iterator permite
a un objeto cliente recorrer los objetos de esa colección, sin conocer cómo se almacenan los datos
internamente.
Para lograr esto, el patrón Iterator sugiere que el objeto Container se diseñe con una interface en la
forma de un objeto Iterator de tal forma que diferentes objetos cliente accedan a su contenido. Un
objeto Iterator contiene métodos públicos que le permiten a un objeto cliente navegar a través de la
lista de objetos del contenedor.
Un iterador puede ser diseñado como un iterador interno o como un externo. En un iterador interno, la
propia colección ofrece métodos para permitir a un cliente, visitar diferentes objetos dentro de la
colección. Por ejemplo, la clase Resultset de java, contiene los datos y los métodos next() permiten
navegar a través de la lista de ítems.
En un iterador externo, la función de la iteración es separada de la colección y se mantiene en el
interior de otro objeto conocido como un iterador. La colección misma retorna un objeto iterator
apropiado al cliente.
Ejemplo
Figura 1: Estructura básica del patrón Iterator
La
Figura 1, muestra la implementación de un ejemplo sencillo que almacena una colección de objetos y
1
luego los recorre y los imprime. A continuación se explica cada clase.
• La clase Iterator define una interface para acceder y atravesar elementos.
• La clase ConcreteIterator implementa la interface Iterator. Mantiene un registro de la posición
actual en el recorrido del agregado (todo).
• La clase Aggregate define una interface para crear un objeto Iterator.
• La clase ConcreteAggregate implementa la interfaz de creación de Iterator para devolver una
instancia ConcreteIterator apropiada
Código fuente en C#
Agregue un nuevo proyecto a la solución llamado Iterator. Cree una carpeta llamada Ejm1. Dentro de
Ejm1 cree las siguientes clases.
namespace Iterator.Ejm1
{
/// <summary>
/// Define una interface para acceder y atravesar elementos
/// </summary>
public abstract class Iterator
{
public abstract object First();
public abstract object Next();
public abstract bool IsDone();
public abstract object CurrentItem();
}
}
namespace Iterator.Ejm1
{
/// <summary>
/// Implementa la interface Iterator.
/// Mantiene un registro de la posición actual en el recorrido del agregado (todo)
/// </summary>
class ConcreteIterator : Iterator
{
private ConcreteAggregate aggregate;
private int current = 0;
// Constructor
public ConcreteIterator(ConcreteAggregate aggregate)
{
this.aggregate = aggregate;
}
2
return ret;
}
namespace Iterator.Ejm1
{
/// <summary>
/// Define una interface para crear un objeto Iterator
/// </summary>
/// <returns></returns>
public abstract class Aggregate
{
using System.Collections;
namespace Iterator.Ejm1
{
/// <summary>
/// Implementa la interfaz de creación de Iterator para devolver una instancia
ConcreteIterator apropiada
/// </summary>
class ConcreteAggregate : Aggregate
{
private ArrayList items = new ArrayList();
// Property
public int Count
{
get { return items.Count; }
}
// Indexer
public object this[int index]
{
get { return items[index]; }
set { items.Insert(index, value); }
}
}
}
To do
Se requiere una aplicación que visualice los datos de un archivo Candidates.txt que contiene los
detalles de diferentes profesionales que ofrecen su candidatura para un trabajo. Por simplicidad,
considere tres atributos: nombre, ubicación del trabajo actual y tipo de certificación.
A continuación se da el código fuente en C#, Usted debe entender el patrón.
namespace Iterator.Ejm2
{
/// <summary>
/// Define una interface para acceder y atravesar elementos
/// </summary>
public abstract class Iterator
{
public abstract object Next();
4
public abstract bool HasNext();
}
}
namespace Iterator.Ejm2
{
/// <summary>
/// Representa un candidato
/// </summary>
public class Candidate
{
using System;
using System.Collections;
namespace Iterator.Ejm2
{
5
/// <summary>
/// Es un ConcreteIterator
/// </summary>
public class AllCandidates : Iterator
{
private ArrayList Data;
IEnumerator Enum;
Candidate nextCandidate;
public AllCandidates()
{
Initialize();
Enum = Data.GetEnumerator();
}
using System;
using System.Collections;
using System.IO;
namespace Iterator.Ejm2
{
public class FileUtil
{
6
while (sLine != null)
{
sLine = objReader.ReadLine();
if (sLine != null)
{
// almacena en un array de Strings
String[] campos = sLine.Split(',');
String name = campos[0].Trim();
String certificationType = campos[1];
String location = campos[2];
}
}
using System;
using Iterator.Ejm2;
namespace Iterator
{
class Program
{
static void Main(string[] args)
{
AllCandidates ac = new AllCandidates();
String selectedCandidates = "Name — - Cert Type — - Location" + "\n"
+ " — — — — — — — — — — — — — — — — — — — ";
while (ac.HasNext())
{
Candidate c = (Candidate)ac.Next();
selectedCandidates = selectedCandidates + "\n" + c.GetName()
+ " - " + c.GetCertificationType() + " - "
+ c.GetLocation();
}
Console.WriteLine(selectedCandidates);
Console.ReadKey();
}
}
}
Archivo d:\\Candidates.txt:
Juan Perez,Microsoft,Bogota
Maria Sanchez,Linux,Cali
Fernando Soto,Oracle,Popayan
...