¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Patrones de diseño en C#
  3. El patrón Mediator
Extrait - Patrones de diseño en C# Los 23 modelos de diseño: descripción y soluciones ilustradas en UML 2 y C# [2ªedición]
Extractos del libro
Patrones de diseño en C# Los 23 modelos de diseño: descripción y soluciones ilustradas en UML 2 y C# [2ªedición] Volver a la página de compra del libro

El patrón Mediator

Descripción

El patrón Mediator tiene como objetivo construir un objeto cuya vocación es la gestión y el control de las interacciones en un conjunto de objetos sin que sus elementos deban conocerse mutuamente.

Ejemplo

El diseño orientado a objetos favorece la distribución del comportamiento entre los objetos del sistema. No obstante, llevada al extremo, esta distribución puede llevar a tener un gran número de enlaces que obligan prácticamente a cada objeto a conocer a todos los demás objetos del sistema. Un diseño con tal cantidad de enlaces puede volverse de mala calidad. En efecto, la modularidad y las posibilidades de reutilización de los objetos se reducen. Cada objeto no puede trabajar sin los demás y el sistema se vuelve monolítico, perdiendo toda su modularidad. Además para adaptar y modificar el comportamiento de una pequeña parte del sistema, resulta necesario definir numerosas subclases.

Las interfaces de usuario dinámicas son un buen ejemplo de tal sistema. Una modificación en el valor de un control gráfico puede conducir a modificar el aspecto de otros controles gráficos como, por ejemplo:

  • volverse visible u oculto;

  • modificar el número de valores posibles (para un menú);

  • cambiar el formato de los valores que es necesario informar.

La primera posibilidad consiste en enlazar cada control cuyo aspecto cambia en función de su valor. Esta posibilidad presenta los inconvenientes citados anteriormente.

La otra posibilidad consiste en implementar el patrón Mediator. Éste consiste en construir un objeto central encargado de la coordinación...

Estructura

1. Diagrama de clases

La figura 4-6.3 detalla la estructura genérica del patrón.

images/figure22-3.png

Figura 4-6.3 - Estructura del patrón Mediator

2. Participantes

Los participantes del patrón son los siguientes:

  • Mediador define la interfaz del mediador para los objetos Elemento.

  • MediadorConcreto (Formulario) implementa la coordinación entre los elementos y gestiona las asociaciones con los elementos.

  • Elemento (Control) es la clase abstracta de los elementos que incluyen sus atributos, asociaciones y métodos comunes.

  • ElementoConcreto1 y ElementoConcreto2 (PopupMenú, ZonaInformación y Botón) son las clases concretas de los elementos que se comunican con el mediador en lugar de con los demás elementos.

3. Colaboraciones

Los elementos envían y reciben mensajes del mediador. El mediador implementa la colaboración y la coordinación entre los elementos.

Dominios de aplicación

El patrón se utiliza en los casos siguientes:

  • Un sistema está formado por un conjunto de objetos basado en una comunicación compleja que conduce a asociar numerosos objetos entre ellos.

  • Los objetos de un sistema son difíciles de reutilizar puesto que poseen numerosas asociaciones con otros objetos.

  • La modularidad de un sistema es mediocre, obligando en los casos en los que se debe adaptar una parte del sistema a escribir numerosas subclases.

Ejemplo en C#

A continuación proponemos simular la información de un formulario con la ayuda de entradas/salidas clásicas basada en una introducción secuencial de datos en cada control hasta que se valida el botón "OK" (mediante el teclado). Un menú permite elegir si el préstamo se realiza o no con un coprestatario.

El código fuente escrito en C# de la clase Control se muestra a continuación.

using System; 
 
public abstract class Control 
{ 
    public string valor { get; protected set; } 
    public Formulario director { get; set; } 
    public string nombre { get; protected set; } 
 
    public Control(string nombre) 
    { 
        this.valor = ""; 
        this.nombre = nombre; 
    } 
 
    public abstract void informa(); 
 
    protected void modifica() 
    { 
        director.controlModificado(this); 
    } 
} 

El código fuente de la subclase ZonaInformacion aparece a continuación. El método informa es muy sencillo, lee el valor introducido por teclado.

using System; 
 
public class ZonaInformacion : Control 
{ 
    public ZonaInformacion(string nombre) : base(nombre) { } 
 
    public override void informa() 
    { 
        Console.WriteLine("Información de: " + nombre); 
        valor = Console.ReadLine(); 
        this.modifica(); 
    } 
} 

El código de la subclase Boton se muestra a continuación. El método informa solicita al usuario si desea activar el botón y en caso de responder favorablemente, invoca al método modifica(modificado) para señalar esta respuesta al mediador.

using System; 
 
public class Boton : Control ...