Saltar al contenido principal

Iterator

BehavioralGang of FourAlrededor de 1 min

También conocido como

Cursor

Propósito

Proporcionar una forma de acceder a los elementos de un objeto agregado secuencialmente sin exponer su
representación subyacente.

Explicación

Ejemplo del mundo real

El cofre del tesoro contiene un conjunto de objetos mágicos. Hay múltiples tipos de artículos tales como anillos,
Los objetos pueden buscarse por tipo utilizando un iterador que proporciona
el cofre del tesoro.

En palabras sencillas

Los contenedores pueden proporcionar una interfaz de iterador agnóstica de representación
para proporcionar acceso a los elementos.

Wikipedia dice

En programación orientada a objetos, el patrón iterador es un patrón de diseño en el que
se utiliza un iterador para recorrer un contenedor y acceder a sus elementos.

Ejemplo programático

La clase principal de nuestro ejemplo es TreasureChest que contiene ítems.

public class TreasureChest {

  private final List<Item> items;

  public TreasureChest() {
    items = List.of(
        new Item(ItemType.POTION, "Potion of courage"),
        new Item(ItemType.RING, "Ring of shadows"),
        new Item(ItemType.POTION, "Potion of wisdom"),
        new Item(ItemType.POTION, "Potion of blood"),
        new Item(ItemType.WEAPON, "Sword of silver +1"),
        new Item(ItemType.POTION, "Potion of rust"),
        new Item(ItemType.POTION, "Potion of healing"),
        new Item(ItemType.RING, "Ring of armor"),
        new Item(ItemType.WEAPON, "Steel halberd"),
        new Item(ItemType.WEAPON, "Dagger of poison"));
  }

  public Iterator<Item> iterator(ItemType itemType) {
    return new TreasureChestItemIterator(this, itemType);
  }

  public List<Item> getItems() {
    return new ArrayList<>(items);
  }
}

Esta es la clase Item:

public class Item {

  private ItemType type;
  private final String name;

  public Item(ItemType type, String name) {
    this.setType(type);
    this.name = name;
  }

  @Override
  public String toString() {
    return name;
  }

  public ItemType getType() {
    return type;
  }

  public final void setType(ItemType type) {
    this.type = type;
  }
}

public enum ItemType {

  ANY, WEAPON, RING, POTION

}

La interfaz Iterator es extremadamente sencilla.

public interface Iterator<T> {

  boolean hasNext();

  T next();
}

En el siguiente ejemplo, iteramos a través de los objetos de tipo anillo encontrados en el cofre.

var itemIterator = TREASURE_CHEST.iterator(ItemType.RING);
while (itemIterator.hasNext()) {
  LOGGER.info(itemIterator.next().toString());
}

Salida del programa:

Ring of shadows
Ring of armor

Diagrama de clases

alt text
Iterator

Aplicabilidad

Utilizar el patrón Iterator

  • Para acceder al contenido de un objeto agregado sin exponer su representación interna.
  • Para soportar múltiples recorridos de objetos agregados.
  • Proporcionar una interfaz uniforme para recorrer diferentes estructuras de agregados.

Tutoriales

Usos conocidos

Créditos