Está en la página 1de 7

Iterator (Iterador)

Fecha de creación: Enero 31 de 2013


Última actualización: Agosto 12 de 2014

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;
}

public override object First()


{
return aggregate[0];
}

public override object Next()


{
object ret = null;
if (current < aggregate.Count - 1)
{
ret = aggregate[++current];
}

2
return ret;
}

public override object CurrentItem()


{
return aggregate[current];
}

public override bool IsDone()


{
return current >= aggregate.Count ? true : false;
}
}
}

namespace Iterator.Ejm1
{
/// <summary>
/// Define una interface para crear un objeto Iterator
/// </summary>
/// <returns></returns>
public abstract class Aggregate
{

public abstract Iterator CreateIterator();


}
}

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();

public override Iterator CreateIterator()


{
return new ConcreteIterator(this);
}

// Property
public int Count
{
get { return items.Count; }
}

// Indexer
public object this[int index]
{
get { return items[index]; }
set { items.Insert(index, value); }
}
}
}

Finalmente el programa Cliente, cópielo en la raíz del proyecto:


3
using System;
using Iterator.Ejm1;
namespace Iterator
{
class Program
{
static void Main(string[] args)
{
ConcreteAggregate a = new ConcreteAggregate();
a[0] = "Item A";
a[1] = "Item B";
a[2] = "Item C";
a[3] = "Item D";

// Create Iterator and provide aggregate


ConcreteIterator i = new ConcreteIterator(a);

Console.WriteLine("Iterating over collection:");

object item = i.First();


while (item != null)
{
Console.WriteLine(item);
item = i.Next();
}

// Wait for user


Console.ReadKey();
}
}
}

La salida del programa debe ser:


Iterating over collection:
Item A
Item B
Item C
Item D

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
{

private string Name;


private string CertificationType;
private string Location;

public Candidate(string name, string certificationType, string location)


{
this.Name = name;
this.CertificationType = certificationType;
this.Location = location;
}

public string GetName()


{
return Name;
}

public void SetName(string name)


{
this.Name = name;
}

public string GetCertificationType()


{
return CertificationType;
}

public void SetCertificationType(string certificationType)


{
this.CertificationType = certificationType;
}

public string GetLocation()


{
return Location;
}

public void setLocation(string location)


{
this.Location = location;
}
}

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();
}

private void Initialize()


{
/*
* Get data from db.
*/
FileUtil util = new FileUtil();
Data = util.FileToArrayList("Candidates.txt");

public override bool HasNext()


{
nextCandidate = null;
while (Enum.MoveNext())
{
Candidate tempObj = (Candidate)Enum.Current;
nextCandidate = tempObj;
break;
}
return (nextCandidate != null);
}

public override Object Next()


{
if (nextCandidate != null)
{
return nextCandidate;
}
return null;
}
}
}

using System;
using System.Collections;
using System.IO;
namespace Iterator.Ejm2
{
public class FileUtil
{

public ArrayList FileToArrayList(String file)


{
ArrayList v = new ArrayList();
StreamReader objReader = new StreamReader("d:\\Candidates.txt");
string sLine = "";

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];

v.Add(new Candidate(name, certificationType, location));


}
}
objReader.Close();
return v;
}

}
}

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
...

También podría gustarte