lunes, 15 de junio de 2015

Patrones de Diseño: Iterator y Mediator

Introducción:

Los patrones de diseño son la base para solucionar problemas comunes en el desarrollo de software y otros ámbitos referentes al diseño de interfaces.

Los patrones de diseño describen una estructura que resuelve un problema particular dentro de un contexto específico. El patrón de diseño debe ser reutilizable y debe servir como guía para desarrollar un patrón distinto en estructura.

En este informe se describen los patrones de diseño Iterator y Mediator, cada uno con sus funciones básicas y un ejemplo de su ocupación.

Iterator

Iterator provee un mecanismo de acceso secuencial a elementos de una colección, definiendo una interface que declara métodos para acceder secuencialmente a los objetos de la colección. Una clase accede a la colección mediante dicha interface.

Su principal característica es que se busca acceder a los contenidos de los objetos sin necesidad de saber cuál es su estructura. Su idea es crear la forma de soportar el recorrido de objetos de diferentes formas mediante una interfaz uniforme.

Se utiliza cuando:

- Una clase necesita acceder al contenido de una colección sin llegar a ser dependiente de la clase que es utilizada para implementar la colección, es decir sin tener que exponer su representación interna.

- Una clase necesita un modo uniforme de acceder al contenido de varias colecciones.

Cuando se necesita soportar múltiples recorridos de una colección.

- El patrón debe ser utilizado cuando se requiera una forma estándar de recorrido de una colección, es decir, cuando no es necesario que el cliente sepa si está recorriendo un List, un Set, un Array, un Queue, etc.



  1. -          El agregado (Aggregate) define una interfaz para crear un objeto Iterator.
  2. -          Iterator define una interfaz para acceder y recorrer los elementos del Aggregate.
  3. -         IteratorConcreto implementa la interfaz de Iterator y guarda la posición actual del recorrido en cada momento.
  4. -          AggregateConcreto implementa la interfaz de creación de iteradores devolviendo una instancia del IteratorConcreto apropiado.


Ejemplo:

Sucursal de Empleados: Se implementa un Array sin que el cliente tenga acceso a saber de ello.



Se crea el iterator para recorrer los elementos de la  sucursal (los empleados). El método Iterator devuelve un objeto DivisionIterator.



El código para recorrer la colección con el iterator es:



Consecuencias

Es posible acceder a una colección de objetos sin conocer el código de los objetos.

Utilizando varios objetos Iterator, es simple tener y manejar varios recorridos al mismo tiempo.

Es posible para una clase Colecction proporcionar diferentes tipos de objetos Iterator que recorran la colección en diferentes modos. Por ejemplo, una clase Colecction que mantiene una asociación entre la clave de los objetos y el valor de los objetos podría tener diferentes métodos para crear Iterators que recorran sólo la clave de los objetos y crear Iterators que recorran sólo el valor de los objetos.

Las clases Iterator simplifican el código de las colecciones, ya que el código de los recorridos se encuentra en los Iterators y no en las colecciones.

Mediator

Un mediator es un patrón de diseño que define un objeto como procesador central. Permite la interacción entre varios objetos, coordinando las relaciones entre los participantes.

Cuando muchos objetos interactúan entre sí, se forma una estructura compleja con demasiadas conexiones. En un caso extremo cada objeto puede conocer a todos los demás objetos. Para prevenir esto, Mediator encapsula el comportamiento de todo un conjunto de objetos en uno solo.

Usar el patrón Mediator cuando:

Un conjunto grande de objetos se comunica de una forma bien definida, pero compleja.

- Reutilizar un objeto se hace difícil porque se relaciona con muchos objetos.

- Las clases son difíciles de reutilizar porque su función básica esta entrelazada con relaciones de dependencia.

- Se puede asociar el uso de un patrón Mediator a la torre de control de un aeropuerto: la función de sincronizar las acciones de los aviones (aterrizar/despegar).



  1. -          Mediator define una interface para comunicarse con los objetos colegas (Colleague).
  2. -          MediatorConcreto implementa la interface y define como los colegas interactúan entre ellos.
  3. -          Colleague define el comportamiento que debe implementar cada colega para poder comunicarse el Mediator de manera estándar.
  4. -          ColleagueConcreto: cada colega conoce a su Mediador,  y lo ocupa para la comunicación entre Colegas.
Ejemplo:

Chat: Los usuarios se comunican en un salón de chat. Se define un interface que todos los usuarios de chat deben implementar para participar. La clase usuario representa a un user que quiera participar del chat.






Su funcionamiento:



Consecuencias

Desacopla a los colegas: el patrón Mediator promueve bajar el acoplamiento entre colegas. Se puede variar y reusar colegas y mediadores independiéntemente.

Simplifica la comunicación entre objetos: los objetos que se comunican de la forma "muchos a muchos" puede ser remplazada por una forma "uno a muchos" que es menos compleja y más elegante. Además esta forma de comunicación es más fácil de entender. Es decir, un objeto no necesita conocer a todos los objetos, tan sólo a un mediador.

Clarifica como los objetos se relacionan en un sistema.

Centraliza el control: el mediador es el que se encarga de comunicar a los colegas, este puede ser muy complejo, difícil de entender y modificar.

Conclusión:
                
Los patrones Iterator y Mediator cumplen funciones específicas muy requeridas en los procesos de desarrollo de software, mientras uno permite el recorrido de cualquier tipo de colección de objetos, indiferente de cual sea la estructura de ellos, el otro permite un control de comunicación entre objetos. Ambos patrones de diseño son una solución reutilizable para problemas frecuentes en la utilización de objetos en desarrollo de programas.

“Una cosa que los diseñadores expertos no hacen es resolver cada problema desde el principio [...]. Cuando encuentran una buena solución la usan una y otra vez. Esta experiencia es lo que los hace expertos” (Gamma, 1995)

2 comentarios: