🚨 ¡Nueva review! ¡Mi teclado ideal! ⌨️ Perfecto para programar, el Logitech MX Keys S . ¡Échale un ojo! 👀

El Patrón de diseño Mediator

El controlador aéreo que evita que tus objetos se estrellen.

Escrito por domin el 27 de noviembre de 2025

✈️ El Patrón Mediator: La Torre de Control

El Patrón Mediator (Mediador), tiene una misión importante: reducir las dependencias caóticas entre objetos. En lugar de que todos hablen con todos, todos hablan con un punto central.

El problema que resuelve es este:
Cuando tienes muchos objetos interactuando, las conexiones se multiplican exponencialmente. Si A conoce a B, C y D; y B conoce a A y C… acabas con un plato de patatas fritas imposible de mantener.

La respuesta es crear un objeto Mediador que encapsula cómo interactúan un conjunto de objetos. Los objetos ya no se comunican directamente, sino a través del mediador.

Diagrama del Patrón Mediator.

🗼 1. Un ejemplo sencillo: La Torre de Control

Imagina un aeropuerto con aviones (los Colegas):

Concepto (analogía)

Rol en Mediator

Tarea principal

Torre de control

Mediador

Centraliza la lógica de comunicación y coordina las acciones.

Aviones

Colegas (componentes)

Solo conocen al Mediador. No saben nada del resto de aviones.

🛠️ 2. Los tres pilares del patrón Mediator

1. Interfaz Mediador

2. Mediador Concreto

3. Componentes (Colegas)

🤔 1. ¿Cuál es la principal diferencia entre Mediator y Observer?

💬 3. El ejemplo clásico: Chat Room

En una sala de chat, cuando tú envías un mensaje, no se lo envías directamente a la IP de cada participante. Se lo envías al servidor de chat (mediador), y este se encarga de distribuirlo a los demás usuarios.

🤔 2. ¿Qué principio SOLID ayuda a cumplir este patrón?

✅ 4. ¿Por Qué Usarlo?

  1. Desacoplamiento: Reduce las dependencias entre componentes.
  2. Control Centralizado: Facilita entender el flujo de comunicación, ya que está todo en un sitio (el mediador) y no disperso.
  3. Reutilización: Los componentes individuales son más fáciles de reutilizar porque no dependen de otros componentes específicos.

❌ 5. Desventaja a Considerar

🤔 3. ¿Qué riesgo corre el objeto Mediador si no se diseña bien?

💡 6. Conclusión

El Mediator pone orden en el caos. Úsalo cuando veas que tus clases tienen demasiadas relaciones “muchos a muchos” y el diagrama de tu arquitectura parezca una tela de araña.

🧠 7. Ejemplo Práctico en PHP

Vamos a implementar un chat simple.

<?php

// 🔹 1. Interfaz Mediador
interface ChatMediator
{
    public function enviarMensaje(string $mensaje, Usuario $emisor): void;
}

// 🔹 2. Mediador Concreto
class SalaChat implements ChatMediator
{
    private array $usuarios = [];

    public function agregarUsuario(Usuario $usuario): void
    {
        $this->usuarios[] = $usuario;
    }

    public function enviarMensaje(string $mensaje, Usuario $emisor): void
    {
        foreach ($this->usuarios as $usuario) {
            // No enviamos el mensaje a quien lo escribió
            if ($usuario !== $emisor) {
                $usuario->recibir($mensaje);
            }
        }
    }
}

// 🔹 3. Componentes (Colegas)
abstract class Usuario
{
    protected ChatMediator $mediator;
    protected string $nombre;

    public function __construct(ChatMediator $mediator, string $nombre)
    {
        $this->mediator = $mediator;
        $this->nombre = $nombre;
    }

    abstract public function enviar(string $mensaje): void;
    abstract public function recibir(string $mensaje): void;
}

class UsuarioChat extends Usuario
{
    public function enviar(string $mensaje): void
    {
        echo "📤 {$this->nombre} envía: $mensaje\n";
        $this->mediator->enviarMensaje($mensaje, $this);
    }

    public function recibir(string $mensaje): void
    {
        echo "📥 {$this->nombre} recibe: $mensaje\n";
    }
}

// 🔹 4. Uso
$sala = new SalaChat();

$juan = new UsuarioChat($sala, "Juan");
$maria = new UsuarioChat($sala, "María");
$pepe = new UsuarioChat($sala, "Pepe");

$sala->agregarUsuario($juan);
$sala->agregarUsuario($maria);
$sala->agregarUsuario($pepe);

$juan->enviar("¡Hola a todos!");
echo "\n";
$maria->enviar("¡Hola Juan!");

// 🖥️ Salida:
// 📤 Juan envía: ¡Hola a todos!
// 📥 María recibe: ¡Hola a todos!
// 📥 Pepe recibe: ¡Hola a todos!
//
// 📤 María envía: ¡Hola Juan!
// 📥 Juan recibe: ¡Hola Juan!
// 📥 Pepe recibe: ¡Hola Juan!

EA, ¡saluditos y nos vemos en los bares! 🍻