Mediator
O Mediator é um padrão comportamental que centraliza a comunicação entre vários objetos.
Sem Mediator, podemos ter:
A ↔ B
A ↔ C
A ↔ D
B ↔ C
B ↔ D
C ↔ D
Conforme o sistema cresce, os objetos ficam fortemente acoplados.
Com Mediator:
A
│
↓
B → Mediator ← C
↑
│
D
Os objetos não conversam diretamente entre si.
Exemplo
Criamos o Mediator:
interface ChatMediator {
send(
message: string,
sender: User
): void;
}
Implementação:
class ChatRoom
implements ChatMediator {
private users: User[] = [];
addUser(user: User) {
this.users.push(user);
}
send(
message: string,
sender: User
) {
for (const user of this.users) {
if (user !== sender) {
user.receive(message);
}
}
}
}
Agora o usuário:
class User {
constructor(
private name: string,
private mediator:
ChatMediator
) {}
send(message: string) {
this.mediator.send(
message,
this
);
}
receive(message: string) {
console.log(
`${this.name} recebeu: ${message}`
);
}
}
Uso:
const chat =
new ChatRoom();
const joao =
new User(
"João",
chat
);
const maria =
new User(
"Maria",
chat
);
chat.addUser(joao);
chat.addUser(maria);
João envia:
joao.send(
"Olá, Maria!"
);
O Mediator decide quem recebe a mensagem.
Exemplo real: Interface gráfica
Imagine um formulário:
Checkbox
↓
Mediator
↓
Input
↓
Mediator
↓
Button
Quando o usuário marca um checkbox, o Mediator pode ativar um botão.
O Checkbox não precisa conhecer diretamente o Button.
Quando usar?
Mediator é útil quando:
- Muitos objetos precisam se comunicar.
- As dependências entre objetos estão crescendo.
- Queremos reduzir acoplamento.
- Existe uma lógica central de comunicação.
Exemplos:
Chat
Interfaces gráficas
Sistemas de eventos
Orquestração de workflows
Sistemas de comunicação
A ideia principal é:
Centralizar a comunicação complexa entre objetos em um objeto intermediário.