✈️ 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.

🗼 1. Un ejemplo sencillo: La Torre de Control
Imagina un aeropuerto con aviones (los Colegas):
- Si un piloto tuviera que llamar a todos los demás pilotos para ver si puede aterrizar, sería un caos. “Oye Boeing, ¿estás en pista?”, “No, soy Airbus, estoy despegando”.
- En su lugar, el piloto llama a la Torre de Control (el mediador).
- “Torre, vuelo 123 solicitando aterrizaje”. La Torre mira su radar y dice “concedido” o “espere”. El piloto no sabe ni le importa qué otros aviones hay, solo obedece a la Torre.
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
- Declara métodos para comunicarse con los componentes (normalmente un método
notificar).
2. Mediador Concreto
- Mantiene referencias a todos los componentes y gestiona su interacción.
3. Componentes (Colegas)
- Cada componente tiene una referencia al mediador. No se comunican entre ellos.
🤔 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?
- Desacoplamiento: Reduce las dependencias entre componentes.
- Control Centralizado: Facilita entender el flujo de comunicación, ya que está todo en un sitio (el mediador) y no disperso.
- Reutilización: Los componentes individuales son más fáciles de reutilizar porque no dependen de otros componentes específicos.
❌ 5. Desventaja a Considerar
- Dios Todopoderoso (God Object): El Mediador puede crecer demasiado y convertirse en una clase gigante que lo sabe todo y lo hace todo, siendo difícil de mantener.
🤔 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! 🍻