¿Cómo implementar el patrón de diseño Iterator(Iterador) en Javascript?

El patrón de diseño iteradoro iteratorproporciona 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 elmentos de un objeto sin necesidad de saber como estos datos están estructurados. Además de que la responsabilidad de recorrer los elementos no esta en el objeto sino en el iterador.

Un iterador se compone normalmente de los siguientes metodos:

  • 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 esta determinado por la función iterador.next()el cual suma 2a la variable indexy es por eso que obtenemos los valores 1,3,5,7,9del arreglo data.

Al final rebobinamos al inicio de datae imprimimos el elemeto 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:

var cursor = db.users.find( { type: 2 } );

while (cursor.hasNext()) {
   imprimirDocumento(cursor.next());
}

En este ejemplo se obtienen los documentos de la colleción usersque tengan una propiedad typeigual 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 *

This site uses Akismet to reduce spam. Learn how your comment data is processed.