1. ¿Qué es el Patrón Mediador
El Patrón Mediador es un patrón de diseño de comportamiento que reduce las dependencias directas entre objetos al transferir su comunicación a un objeto mediador. En el Patrón Mediador, los objetos ya no se comunican directamente entre sí, sino a través del objeto mediador.
2. Características y Ventajas del Patrón Mediador
Las características y ventajas del Patrón Mediador son las siguientes:
- Reduce el acoplamiento directo entre objetos, disminuyendo la complejidad del sistema.
- Simplifica la comunicación entre objetos al tener un objeto mediador que maneje su comunicación.
- Centraliza el control de las interacciones entre objetos, facilitando la extensión y el mantenimiento.
3. Ejemplos del Mundo Real del Patrón Mediador
El Patrón Mediador tiene muchas aplicaciones en escenarios de la vida real. Por ejemplo, en un sistema de programación de un aeropuerto, el despachador actúa como el mediador, mientras que los diferentes módulos como aviones y tráfico terrestre sirven como clases colegas que se comunican y coordinan a través del despachador.
4. Implementación del Patrón Mediador en Golang
4.1 Introducción al Diagrama de Clase UML
A continuación se muestra el diagrama de clase UML para el Patrón Mediador en Golang:
4.2 Introducción del Ejemplo
En este ejemplo, implementaremos una sencilla aplicación de sala de chat utilizando el Patrón Mediador para gestionar la comunicación entre diferentes usuarios.
4.3 Paso de Implementación 1: Definir la Interfaz de Mediador y Mediador Concreto
Primero, definimos una interfaz de mediador y una clase de mediador concreta:
type Mediator interface {
registerColleague(colleague Colleague)
sendMessage(message string, colleague Colleague)
}
type ConcreteMediator struct {
colleagues map[string]Colleague
}
func (m *ConcreteMediator) registerColleague(colleague Colleague) {
m.colleagues[colleague.getName()] = colleague
}
func (m *ConcreteMediator) sendMessage(message string, colleague Colleague) {
for _, c := range m.colleagues {
if c != colleague {
c.receiveMessage(message)
}
}
}
4.4 Paso de Implementación 2: Definir la Interfaz de Colega y Colegas Concretos
A continuación, definimos una interfaz de colega y clases concretas de colegas:
type Colleague interface {
receiveMessage(message string)
sendMessage(message string)
getName() string
}
type ConcreteColleagueA struct {
mediator Mediator
name string
}
func (c *ConcreteColleagueA) receiveMessage(message string) {
fmt.Printf("%s recibió el mensaje: %s\n", c.name, message)
}
func (c *ConcreteColleagueA) sendMessage(message string) {
c.mediator.sendMessage(message, c)
}
func (c *ConcreteColleagueA) getName() string {
return c.name
}
type ConcreteColleagueB struct {
mediator Mediator
name string
}
func (c *ConcreteColleagueB) receiveMessage(message string) {
fmt.Printf("%s recibió el mensaje: %s\n", c.name, message)
}
func (c *ConcreteColleagueB) sendMessage(message string) {
c.mediator.sendMessage(message, c)
}
func (c *ConcreteColleagueB) getName() string {
return c.name
}
4.5 Paso de Implementación 3: Gestión de Colegas en el Mediador
En la clase de mediador específica, necesitamos implementar el método registerColleague
y el método sendMessage
para gestionar la comunicación entre clases colegas:
func main() {
mediator := &ConcreteMediator{
colleagues: make(map[string]Colleague),
}
colleagueA := &ConcreteColleagueA{
mediator: mediator,
name: "Colega A",
}
colleagueB := &ConcreteColleagueB{
mediator: mediator,
name: "Colega B",
}
mediator.registerColleague(colleagueA)
mediator.registerColleague(colleagueB)
colleagueA.sendMessage("¡Hola, mundo!")
colleagueB.sendMessage("¡Hola, aquí!")
}
En la función main
, creamos un objeto mediador específico y dos objetos colegas específicos, luego registramos los objetos colegas a través del objeto mediador y realizamos pruebas de comunicación.