Mediator

Descargar como odt, pdf o txt
Descargar como odt, pdf o txt
Está en la página 1de 5

Ingeniería del Software II

Unicomfacauca

MEDIATOR (MEDIADOR, INTERMEDIARIO, NEGOCIADOR)

Resumen
El patrón Mediator puede ser útil para diseñar una comunicación controlada y coordinada entre
grupos de objetos, eliminando la necesidad de una comunicación directa
Descripción
En general, una aplicación orientada a objetos consiste de un conjunto de objetos que interactúan con el
fin de proveer un servicio. Esta interacción puede ser directa (punto a punto). La Figura 1 muestra este
tipo de interacción entre un ObjetoA y un ObjetoB.

Figura 1: Comunicación punto a punto entre dos objetos


Cuando el número de objetos incrementa, este tipo de interacción puede conducir a una compleja
maraña de referencias entre objetos (Ver Figura 2), lo cual afecta la mantenibilidad de la aplicación.
Además, la interacción directa entre muchos objetos, afecta el reuso debido al alto acoplamiento.

Figura 2: Comunicación punto a punto entre más objetos


En este caso, el patrón Mediator puede ser útil para diseñar una comunicación controlada y
coordinada entre grupos de objetos, eliminando la necesidad de una comunicación directa entre
objetos (Ver Figura 3).

1
Ingeniería del Software II
Unicomfacauca
Figura 3: Interacción de objetos: Mediator como centro de comunicación
El patrón mediator sugiere una abstracción de la interacción de todos los objetos, en una clase separada
llamada Mediator, que tiene el conocimiento de la interacción de un grupo de objetos. Cada objeto del
grupo es responsable de ofrecer los servicios, pero los objetos no interactúan unos con otros
directamente para este propósito. La interacción entre dos objetos es enrutada a través de la clase
Mediator. Todos los objetos envían sus mensajes al Mediator. El Mediator envía los mensajes
apropiados a los objetos. Este diseño tiene las siguientes ventajas:
• Es más fácil alterar el comportamiento de las relaciones entre los objetos, reemplazando el
mediador con una de sus subclases, con una funcionalidad extendida o alterada.
• Mover las dependencias entre los objetos fuera de los objetos individuales favorece la
reutilización.
• Debido a que los objetos no se comunican unos con otros directamente, es más fácil hacer
unidades de prueba de los objetos.
• Debido al bajo acoplamiento es más fácil modificar las clases individuales sin afectar las otras
clases.
En conclusión, este patrón debe ser utilizado en casos donde convenga utilizar un procesador central,
en vez de que cada objeto tenga que conocer la implementación de otro. Imaginemos un aeropuerto:
que pasaría si no tuviese una torre de control y todos los aviones que deban aterrizar/despegar se tienen
que poner todos de acuerdo para hacerlo. Además cada avión debe conocer detalles de otros aviones
(velocidad de despegue, nafta que le queda a cada uno que quiera aterrizar, etc).
Para evitar esto se utiliza una torre de control que sincroniza el funcionamiento de un aeropuerto. Esta
torre de control se puede ver como un mediador entre aviones.

Ejemplo
Un diagrama general del patrón Mediator se muestra en la Figura 4. A continuación se explica cada
clase.

Figura 4: Diseño genérico del patrón Mediator


• Mediator: define una interface para comunicarse con los objetos colegas.
2
Ingeniería del Software II
Unicomfacauca
• MediatorConcreto: implementa la interface y define cómo los colegas se comunican entre ellos.
Además los conoce y mantiene, con lo cual hace de procesador central de todos ellos.
• Colleague (colega o participante): define el comportamiento que debe implementar cada colega
para poder comunicarse con el mediador de una manera estandarizada para todos.
• ColleagueConcreto: cada colega conoce su mediador, y lo usa para comunicarse con otros
colegas.
Los colegas envían y reciben requerimientos de un objeto mediador. El mediador gestiona cada
mensaje y se lo comunica a otro colega si fuese necesario.
Nuestro ejemplo será un chat, donde habrá usuarios que se comunicaran entre sí en un salón de chat.
Para los usuarios se define una interface llamada IUsuarioChat, que todos los usuarios que quieran
participar de un chat deberán implementar. La interfaz IUsuarioChat declara los métodos enviar() y
recibir(). La clase Usuario representa un usuario que quiere chatear.
Se define la interfaz IsalonDeChat, el mediador, que define los métodos registra() y envia(), que
permiten registrar un usuario en el chat y enviar un mensaje al chat.
La clase SalonDeChat implementa ISalonDeChat, y corresponde al mediador concreto, que permitirá
comunicarse a los usuarios.

El diseño se observa en la Figura 5.

Código fuente en Java


A continuación el código fuente en java.
public interface IUsuarioChat {
public void recibe(String de, String msg);

3
Ingeniería del Software II
Unicomfacauca
public void envia(String a, String msg);
}

public class Usuario implements IUsuarioChat {


private String nombre;
private SalonDeChat salon;

// Constructor
public Usuario(SalonDeChat salonDeChat) {
this.salon = salonDeChat;
}

public String getNombre() {


return nombre;
}

public void setNombre(String nombre) {


this.nombre = nombre;
}

public void recibe(String de, String msg) {


String s = "el usuario " + de + " te dice: " + msg;
System.out.println(nombre + ": " + s);
}

public void envia(String a, String msg) {


salon.envia(nombre, a, msg);
}
}

public interface ISalonDeChat {


public void registra(Usuario participante);
public void envia(String de, String a, String msg);
}

import java.util.HashMap;
public class SalonDeChat implements ISalonDeChat {
private HashMap<String,Usuario> participantes = new HashMap<String,
Usuario>();

public void registra(Usuario user){


participantes.put(user.getNombre(), user);
}

public void envia (String de, String a, String msg){


if (participantes.containsKey(de) && participantes.containsKey(a)){
Usuario u = participantes.get(a);
u.recibe(de, msg);
}else{
System.out.println("Usuario inexistente");
}
}
}

public class ClienteMain {


public static void main(String[] args) {
SalonDeChat salon = new SalonDeChat();

4
Ingeniería del Software II
Unicomfacauca
Usuario u = new Usuario(salon);
u.setNombre("Juan");
salon.registra(u);

Usuario u1 = new Usuario(salon);


u1.setNombre("Pepe");
salon.registra(u1);

Usuario u2 = new Usuario(salon);


u2.setNombre("Pedro");
salon.registra(u2);

//envia(a, msg);
u.envia("Pepe", "Hola como andas?");
u1.envia("Juan", "Todo ok, vos?");
u2.envia("Juan", "Juan como te va?");

u2.envia("Martin", "Martin estas?");


}
}

La salida del programa debe ser:


Pepe: el usuario Juan te dice: Hola como andas?
Juan: el usuario Pepe te dice: Todo ok, vos?
Juan: el usuario Pedro te dice: Juan como te va?
Usuario inexistente

También podría gustarte