Accueil / Tutoriels / Mediator
Mediator
Publié le 8 Avril 2025Mediator (médiateur en français) est un design pattern comportemental qui a pour objectif de réduire les dépendances entres les objets. Il permet aux objets de communiquer sans se référencer directement les uns avec les autres en passant par un intermédiaire central : le médiateur.
Principe
Exemples d’utilisations
Gestion dynamique d’un formulaire complexe
Coordonner des microservices dans une architecture back-end
Points d’attentions
Implémenter un Mediator
Exemple d’utilisation de Mediator en Go
package admin
type Mediator interface {
Notify(sender Component, event string)
}
package admin
type Component interface {
SetMediator(mediator Mediator)
}
package admin
type NotificationMediator struct {
Logger *Logger
Emailer *Emailer
Auditor *Auditor
Dashboard *DashboardNotifier
}
func (m *NotificationMediator) Notify(sender Component, event string) {
switch event {
case "user_deleted":
m.Logger.Log("User deleted")
m.Emailer.Send("admin@example.com", "Un utilisateur a été supprimé.")
m.Auditor.Record("Suppression utilisateur")
m.Dashboard.Update("Un utilisateur a été supprimé.")
}
}
package admin
import "fmt"
type Logger struct{ mediator Mediator }
func (l *Logger) SetMediator(m Mediator) {
l.mediator = m
}
func (l *Logger) Log(msg string) {
fmt.Println("[Log]", msg)
}
package admin
import "fmt"
type Emailer struct {
mediator Mediator
}
func (e *Emailer) SetMediator(m Mediator) {
e.mediator = m
}
func (e *Emailer) Send(to, msg string) {
fmt.Println("[Email]", to, msg)
}
package admin
import "fmt"
type Auditor struct {
mediator Mediator
}
func (a *Auditor) SetMediator(m Mediator) {
a.mediator = m
}
func (a *Auditor) Record(event string) {
fmt.Println("[Audit]", event)
}
package admin
import "fmt"
type DashboardNotifier struct {
mediator Mediator
}
func (d *DashboardNotifier) SetMediator(m Mediator) {
d.mediator = m
}
func (d *DashboardNotifier) Update(msg string) {
fmt.Println("[Dashboard]", msg)
}
package main
import "design_patterns/mediator/admin"
func main() {
logger := &admin.Logger{}
emailer := &admin.Emailer{}
auditor := &admin.Auditor{}
dashboard := &admin.DashboardNotifier{}
mediator := &admin.NotificationMediator{
Logger: logger,
Emailer: emailer,
Auditor: auditor,
Dashboard: dashboard,
}
logger.SetMediator(mediator)
emailer.SetMediator(mediator)
auditor.SetMediator(mediator)
dashboard.SetMediator(mediator)
mediator.Notify(nil, "user_deleted")
}
Le même exemple en PHP
namespace Practice\DesignPatterns\Mediator;
interface MediatorInterface {
public function notify(object $sender, string $event): void;
}
namespace Practice\DesignPatterns\Mediator;
interface ComponentInterface
{
public function setMediator(MediatorInterface $mediator): void;
}
namespace Practice\DesignPatterns\Mediator;
class NotificationMediator implements MediatorInterface
{
private Logger $logger;
private Emailer $emailer;
private Auditor $auditor;
private DashboardNotifier $dashboard;
public function __construct(Logger $logger, Emailer $emailer, Auditor $auditor, DashboardNotifier $dashboard)
{
$this->logger = $logger;
$this->emailer = $emailer;
$this->auditor = $auditor;
$this->dashboard = $dashboard;
}
public function notify($sender, string $event): void
{
if ($event === 'user_deleted') {
$this->logger->log("User deleted");
$this->emailer->send("admin@example.com", "Un utilisateur a été supprimé.");
$this->auditor->record("Suppression utilisateur");
$this->dashboard->update("Un utilisateur a été supprimé.");
}
}
}
namespace Practice\DesignPatterns\Mediator;
class Logger implements ComponentInterface
{
private MediatorInterface $mediator;
public function setMediator(MediatorInterface $mediator): void
{
$this->mediator = $mediator;
}
public function log(string $msg): void
{
echo "[Log] $msg\n";
}
}
namespace Practice\DesignPatterns\Mediator;
class Emailer implements ComponentInterface
{
private MediatorInterface $mediator;
public function setMediator(MediatorInterface $mediator): void
{
$this->mediator = $mediator;
}
public function send(string $to, string $msg): void
{
echo "[Email] $to: $msg\n";
}
}
namespace Practice\DesignPatterns\Mediator;
class Auditor implements ComponentInterface
{
private MediatorInterface $mediator;
public function setMediator(MediatorInterface $mediator): void
{
$this->mediator = $mediator;
}
public function record(string $event): void
{
echo "[Audit] $event\n";
}
}
namespace Practice\DesignPatterns\Mediator;
class DashboardNotifier implements ComponentInterface
{
private MediatorInterface $mediator;
public function setMediator(MediatorInterface $mediator): void
{
$this->mediator = $mediator;
}
public function update(string $msg): void
{
echo "[Dashboard] $msg\n";
}
}
declare(strict_types=1);
use Practice\DesignPatterns\Mediator\Auditor;
use Practice\DesignPatterns\Mediator\DashboardNotifier;
use Practice\DesignPatterns\Mediator\Emailer;
use Practice\DesignPatterns\Mediator\Logger;
use Practice\DesignPatterns\Mediator\NotificationMediator;
$logger = new Logger();
$emailer = new Emailer();
$auditor = new Auditor();
$dashboard = new DashboardNotifier();
$mediator = new NotificationMediator($logger, $emailer, $auditor, $dashboard);
$logger->setMediator($mediator);
$emailer->setMediator($mediator);
$auditor->setMediator($mediator);
$dashboard->setMediator($mediator);
$mediator->notify(null, 'user_deleted');