El patrón de diseño iterador o iterator proporciona una manera de acceder a elementos de un objeto (que contiene algún tipo de datos agregados como un arreglo o una lista) secuencialmente sin exponer su estructura interna.

Cita original de Design Patterns: Elements of Reusable Object-Oriented Software por GoF:

Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.

Este patrón de diseño también es conocido como cursor, si has usado cursores para recorrer los elementos obtenidos de una base de datos, ¿Que crees?, ahí estas utilizando el patrón de diseño iterador.

El objetivo de este patrón es poder recorrer y obtener elementos de un objeto sin necesidad de saber como estos datos están estructurados. Además de que la responsabilidad de recorrer los elementos no está en el objeto sino en el iterador.

Un iterador se compone normalmente de los siguientes métodos:

  • iterador.hasNext() o iterador.hayMas()
  • iterador.next() o iterador.siguiente()
  • iterador.current() o iterador.elementoActual()
  • iterador.rewind() o iterador.rebobinar(), que nos permite posicionar el “cursor” en el primer elemento.

Aquí te dejo como implementarlo en un navegador web:

Podemos notar que el siguiente elemento está determinado por la función iterador.next() el cual suma 2 a la variable index y es por eso que obtenemos los valores 1,3,5,7,9 del arreglo data.

Al final rebobinamos al inicio de data e imprimimos el elemento actual, es decir 1, con el método iterador.current().

MongoDB es una base de datos basada en documentos en formato BJSON que es la forma binaria de JSON, en MongoShell se puede ver el uso de este patrón de diseño:

const cursor = db.users.find( { type: 2 } );
while (cursor.hasNext()) {
  imprimirDocumento(cursor.next());
}

En este ejemplo se obtienen los documentos de la colección users que tengan una propiedad type igual a 2, luego se recorren uno por uno a través de los métodos cursor.hasNext()y cursor.next().

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *