Mediador

RECU-0194 (Recurso Patrón)

Descripción

Un Mediador es un patrón de diseño que coordina las relaciones entre sus asociados. Define un objeto que encapsula cómo interactúan un conjunto de objetos. Promueve un bajo acoplamiento al evitar que los objetos se refieran unos a otros explícitamente, y permite variar la interacción entre ellos de forma independiente.

Este patrón también es conocido como Mediator.

Patrones Relacionados

  • Facade: Se diferencia en el uso de Fachada en que este abstrae un conjunto de objetos usando un protocolo unidireccional mientras que Medidor utiliza un protocolo multidireccional
  • Observador: Mediante este patrón los objetos pueden comunicarse con el Mediador

Clasificación

Patrón de comportamiento

Motivación

Cuando muchos objetos interactúan con otros objetos, se puede formar una estructura muy compleja, con objetos con muchas conexiones con otros objetos. En un caso extremo cada objeto puede conocer a todos los demás objetos. Para evitar esto el patrón Mediator encapsula el comportamiento de todo un conjunto de objetos en un solo objeto.

Para evitar esto, el patrón, encapsula el comportamiento de todo un conjunto de objetos en un solo objeto. Los objetos envían y reciben peticiones a través del mediador, este implementa el comportamiento cooperativo encaminando las peticiones a los objetos deseados

Aplicabildidad

Se recomienda el uso del patrón si:

  • Un conjunto grande de objetos se comunica de una forma bien definida, pero compleja
  • Existe dificulta para reutilizar objetos, ya que nos refierimos a varios objetos para comunicarnos
  • El comportamiento de muchos objetos (que esta distribuido en varias clases) puede resumirse en una o varias por subclasificación.

Estructura

La representación gráfica del modelo es la siguiente:

180

Participantes

  • Mediador:Define una interfaz para comunicarse con los otros objetos
  • Colega: Cada colega conoce su mediador, y usa a este para comunicarse con otros colegas.
  • ColegaConcreto:Implementa el comportamiento del colega
  • MediadorConcreto: Implementa el comportamiento cooperativo entre los colegas (como se comunican entre ellos). Además los conoce y mantiene.

Colaboraciones

Los colegas envían y reciben requerimientos (requests) de un objeto mediador. El mediador implementa como se comunican los colegas

Consecuencias

El patrón Mediator tiene los siguientes beneficios y desventajas:

  • Desacopla a los colegas: el patrón Mediator promueve bajar el acoplamiento entre colegas. Se puede variar y rehusar colegas y mediadores independientemente
  • 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.
  • Abstrae como los objetos cooperan: Haciendo a la mediación un concepto independiente y encapsulandolo en un objeto permite enfocar como los objetos interactúan. Esto ayuda a clarificar 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

Implementación

Es recomendable atender a los siguientes detalles para la implementación del patrón:

  • Omitir la clase abstracta Mediador: No es necesario crear una clase abstracta cuando los objetos solo trabajna con un Mediador. El acoplamiento abstracto de dicho clase permite que los objetos trabajen con diferentes subclases Mediador y viceversa
  • Comunicación, Objeto y Mediador. los objetos se comunican con su mediador cuando se produce un evento. Cada vez que existe un cambio de estado lo notifican al mediador. El mediador responde propagando los efectos de dichos eventos a los objetos afectados

Código de ejemplo

class Mediator {
  private boolean slotLleno = false;
  private int numero;
  public synchronized void guardarMensaje( int num ) {
    while (slotLleno == true) {
      try {
        wait();
      }
      catch (InterruptedException e ) { }
    }
    slotLleno = true;
    numero = num;
    notifyAll();
  }
  public synchronized int devolverMensaje() {
    while (slotLleno == false)
      try {
        wait();
      }
      catch (InterruptedException e ) { }
    slotLleno = false;
    notifyAll();
    return numero;
  }
}
class Productor extends Thread {
  private Mediator med;
  private int    id;
  private static int num = 1;
  public Productor ( Mediator m ) {
    med = m;
    id = num++;
  }
  public void lanzar() {
    int num;
    while (true) {
      med.guardarMensaje( num = (int)(Math.random()*100) );
      System.out.print( "p" + id + "-" + num + "  " );
    }
  }
}
class Consumidor extends Thread {
 
  private Mediator med;
  private int    id;
  private static int num = 1;
  public Consumidor( Mediator m ) {
    med = m;
    id = num++;
  }
  public void run() {
    while (true) {
      System.out.print("c" + id + "-" + med.recuperarMensaje() + "  ");
    }
  }
}
class MediatorDemo {
  public static void main( String[] args ) {
    Mediator mb = new Mediator();
    new Productor( mb ).start();
    new Productor( mb ).start();
    new Consumidor ( mb ).start();
    new Consumidor ( mb ).start();
    new Consumidor ( mb ).start();
    new Consumidor ( mb ).start();
  }
}

Usos conocidos

  • Se suele emplear en gestores de cambio
  • Aparece en el framework de dibujo Unidraw
  • La gestión de mensajes dentro de SmallTalk

Contenidos relacionados