Introducción
El patrón Mediator es un patrón de diseño de comportamiento que se utiliza para reducir las dependencias entre los objetos de un programa. En lugar de que los objetos se comuniquen directamente entre sí, se comunican a través de un objeto mediador. Este patrón promueve el principio de "comunicación indirecta" y ayuda a mantener un diseño más limpio y manejable.
Objetivos del Patrón Mediator
- Reducir las dependencias entre los objetos: Los objetos no necesitan conocer los detalles de otros objetos para interactuar con ellos.
- Facilitar la comunicación entre objetos: Centraliza la comunicación en un único punto, lo que simplifica la gestión de las interacciones.
- Mejorar la mantenibilidad: Al reducir las dependencias, es más fácil modificar y extender el sistema.
Ejemplo Práctico
Imaginemos un sistema de chat donde varios usuarios pueden enviar mensajes entre sí. Sin el patrón Mediator, cada usuario tendría que conocer a todos los demás usuarios para enviarles mensajes directamente. Con el patrón Mediator, los usuarios solo necesitan conocer al mediador, que se encargará de distribuir los mensajes.
Diagrama de Clases
+-------------------+ | Mediator | +-------------------+ | +sendMessage() | | +addUser() | +-------------------+ | v +-------------------+ | ConcreteMediator | +-------------------+ | -users: List<User>| +-------------------+ | +sendMessage() | | +addUser() | +-------------------+ | v +-------------------+ | User | +-------------------+ | -name: String | | -mediator: Mediator| +-------------------+ | +send() | | +receive() | +-------------------+
Implementación en Código
A continuación, se muestra una implementación en Python del patrón Mediator:
class Mediator: def send_message(self, message, user): pass def add_user(self, user): pass class ConcreteMediator(Mediator): def __init__(self): self.users = [] def add_user(self, user): self.users.append(user) def send_message(self, message, user): for u in self.users: if u != user: u.receive(message) class User: def __init__(self, name, mediator): self.name = name self.mediator = mediator def send(self, message): print(f"{self.name} sends: {message}") self.mediator.send_message(message, self) def receive(self, message): print(f"{self.name} receives: {message}") # Uso del patrón Mediator mediator = ConcreteMediator() user1 = User("Alice", mediator) user2 = User("Bob", mediator) user3 = User("Charlie", mediator) mediator.add_user(user1) mediator.add_user(user2) mediator.add_user(user3) user1.send("Hello, everyone!")
Explicación del Código
- Clase
Mediator
: Define la interfaz para enviar mensajes y agregar usuarios. - Clase
ConcreteMediator
: Implementa la interfazMediator
y mantiene una lista de usuarios. Gestiona la distribución de mensajes entre los usuarios. - Clase
User
: Representa a un usuario en el sistema de chat. Cada usuario tiene un nombre y una referencia al mediador. Los métodossend
yreceive
permiten enviar y recibir mensajes a través del mediador.
Ejercicio Práctico
Implemente un sistema de control de tráfico aéreo utilizando el patrón Mediator. En este sistema, varios aviones se comunican con una torre de control para recibir instrucciones de aterrizaje y despegue.
Requisitos
- Clase
Mediator
: Define la interfaz para la comunicación entre aviones y la torre de control. - Clase
ConcreteMediator
: Implementa la interfazMediator
y gestiona la comunicación entre los aviones. - Clase
Airplane
: Representa un avión en el sistema. Cada avión puede solicitar permiso para aterrizar o despegar a través del mediador.
Solución
class Mediator: def request_landing(self, airplane): pass def request_takeoff(self, airplane): pass class ConcreteMediator(Mediator): def __init__(self): self.airplanes = [] def add_airplane(self, airplane): self.airplanes.append(airplane) def request_landing(self, airplane): print(f"Torre de control: Permiso para aterrizar concedido a {airplane.name}") def request_takeoff(self, airplane): print(f"Torre de control: Permiso para despegar concedido a {airplane.name}") class Airplane: def __init__(self, name, mediator): self.name = name self.mediator = mediator def request_landing(self): print(f"{self.name} solicita permiso para aterrizar.") self.mediator.request_landing(self) def request_takeoff(self): print(f"{self.name} solicita permiso para despegar.") self.mediator.request_takeoff(self) # Uso del patrón Mediator mediator = ConcreteMediator() airplane1 = Airplane("Avión 1", mediator) airplane2 = Airplane("Avión 2", mediator) mediator.add_airplane(airplane1) mediator.add_airplane(airplane2) airplane1.request_landing() airplane2.request_takeoff()
Explicación del Código
- Clase
Mediator
: Define la interfaz para solicitar aterrizajes y despegues. - Clase
ConcreteMediator
: Implementa la interfazMediator
y gestiona las solicitudes de aterrizaje y despegue. - Clase
Airplane
: Representa un avión en el sistema. Cada avión puede solicitar permiso para aterrizar o despegar a través del mediador.
Conclusión
El patrón Mediator es una herramienta poderosa para gestionar la comunicación entre objetos en un sistema, reduciendo las dependencias y mejorando la mantenibilidad. Al centralizar la comunicación en un mediador, es más fácil modificar y extender el sistema sin afectar a los objetos individuales.
Resumen
- Objetivo: Reducir las dependencias entre objetos y centralizar la comunicación.
- Ventajas: Mejora la mantenibilidad y facilita la gestión de las interacciones.
- Ejemplo: Sistema de chat y control de tráfico aéreo.
- Ejercicio: Implementar un sistema de control de tráfico aéreo utilizando el patrón Mediator.
Con este conocimiento, estás listo para aplicar el patrón Mediator en tus propios proyectos y mejorar la estructura y mantenibilidad de tu código.
Curso de Patrones de Diseño de Software
Módulo 1: Introducción a los Patrones de Diseño
- ¿Qué son los Patrones de Diseño?
- Historia y Origen de los Patrones de Diseño
- Clasificación de los Patrones de Diseño
- Ventajas y Desventajas de Usar Patrones de Diseño
Módulo 2: Patrones Creacionales
- Introducción a los Patrones Creacionales
- Singleton
- Factory Method
- Abstract Factory
- Builder
- Prototype
Módulo 3: Patrones Estructurales
Módulo 4: Patrones de Comportamiento
- Introducción a los Patrones de Comportamiento
- Chain of Responsibility
- Command
- Interpreter
- Iterator
- Mediator
- Memento
- Observer
- State
- Strategy
- Template Method
- Visitor
Módulo 5: Aplicación de Patrones de Diseño
- Cómo Seleccionar el Patrón Adecuado
- Ejemplos Prácticos de Uso de Patrones
- Patrones de Diseño en Proyectos Reales
- Refactorización Usando Patrones de Diseño
Módulo 6: Patrones de Diseño Avanzados
- Patrones de Diseño en Arquitecturas Modernas
- Patrones de Diseño en Microservicios
- Patrones de Diseño en Sistemas Distribuidos
- Patrones de Diseño en Desarrollo Ágil