miércoles, 13 de febrero de 2013

Iterator Pattern

  • Clasificación del patrón: de comportamiento.
  • Intención: proporcionar una forma de acceder secuencialmente a los elementos de un objeto agregado, sin exponer su representación interna.
  • También conocido como: Cursor.
  • Aplicabilidad: Se utiliza este patrón cuando se necesita
    • para acceder al contenido de un objeto agregado sin exponer su representación interna.
    • para apoyar recorridos múltiples sobre objetos agregados.
    • para proporcionar una interfaz uniforme para atravesar diferentes estructuras agregadas (es decir, para apoyar iteración polimórfica).
  • Estructura:
  • Participantes
    • Iterator: define una interfaz para acceder y recorrer los elementos.
    • ConcreteIterator: implementa la interfaz Iterator y realiza un seguimiento de la posición actual en el recorrido del agregado.
    • Agregado: define una interfaz para crear un objeto Iterator.
    • ConcreteAggregate: implementa la interfaz de creación de Iterator para devolver una instancia de la ConcreteIterator adecuada.
  • Colaboraciones
    •  Un ConcreteIterator mantiene un seguimiento del objeto actual en el agregado y puede calcular el objeto siguiente en el recorrido.
  • Implementación
    • ¿Quién controla la iteración?
      • Si es el cliente, el iterador es un iterador externo. Estos son más flexibles que los internos. Es fácil comparar dos colecciones para con un repetidor externo, pero es prácticamente imposible para los internos.
      • Si es el iterador, es un iterador interno.
    • ¿Quién define el algoritmo de recorrido? 
      • El iterador: es fácil usar diferentes algoritmos de iteración en el mismo agregado, y también puede ser más fácil de reutilizar el mismo algoritmo sobre diferentes agregados. Pero esta solución posdía violar la encapsulación del agregado en caso de que el algoritmo de recorrido necesite acceder a las variables privadas del agregado.
      • El agregado puede definir el algoritmo de recorrido y utilizar el iterador para almacenar sólo el estado de la iteración. Llamamos a esta clase de iterador un "cursor", ya que se limita a señalar la posición actual en el agregado.
    • Un iterador robusto asegura que las inserciones y eliminaciones no interfiera con recorrido.
    • Operaciones adicionales: la interfaz Iterator tiene como base las operaciones first(), next(), isDone() y currentItem(), pero podría ser necesario agregar más. Por ejemplo, previous() o goTo().
    • Iteradores de composites: los iteradores externos pueden ser difícil de implementar sobre estructuras compuestas, ya que tiene que almacenar una ruta a través del Composite para no perder de vista el objeto actual. A veces es más fácil simplemente utilizar un iterador interno.

      Si los nodos de un Composite tiene una interfaz para pasar de un nodo a sus hermanos, padres e hijos, entonces un iterador "cursor" puede ofrecer una alternativa mejor.
    • NullIterator: es útil para el manejo de contornos, donde los elementos Aggregate devuelven un iterador concreto como de costumbre, pero los elementos hoja devuelven una instancia de NullIterator, el cual siempre evalúa IsDone () como true.
  • Consecuencias:  
    • Permite que los agregados puedan ser atravesados ​​de diferentes maneras. Los iteradores facilitan el cambio de algoritmo de recorrido: basta con sustituir la instancia del iterador con una diferente o instanciar una subclases Iterator, que puede realizar nuevos recorridos.
    •  Los iteradores simplifican la interfaz Aggregate.
    • Un iterador mantiene un registro de su propio estado transversal, por lo tanto puede tener más de un recorrido en curso a la vez.
  • Motivación: el patrón surge por la necesidad de acceder a los elementos de un contenedor de objetos (un Aggregate) sin exponer su representación interna. Además, es posible requerir de más de una forma de recorrer la estructura.

    La solución que propone el patrón es que la responsabilidad del recorrido se traslade a un objeto iterador, y añadirle métodos que permitan recorrer la estructura sin referenciar explícitamente su representación.
  • Ejemplo: 
  • Patrones relacionados
    • Composite: los Iterators son frecuentemente aplicados sobre composites.
    • Factory Method: iteradores polimórficos se basan en Factory Methods para crear una instancia de la subclase Iterator apropiado.
    • Memento: se utiliza a menudo en conjunto con el patrón Iterator. Un iterador puede usar un memento para capturar el estado de una iteración. El iterador guarda el memento internamente

1 comentario:

  1. Hola compañero, me gustaría ponerme en contacto contigo para que me resolvieras algunas dudas que tengo sobre un ejercicio que tengo de patrones de diseño, un cordial saludo. ¿Me puedes facilitar tu correo?,un saludo y gracias.

    ResponderEliminar