Le design pattern Mediator
Description
Le design pattern Mediator a pour but de construire un objet dont la vocation est d’encapsuler les interactions d’un ensemble d’objets.
Exemple
La conception d’un système au moyen d’objets favorise la distribution du comportement entre ces objets. Cependant, à l’extrême, cette distribution peut conduire à un très grand nombre de liaisons obligeant quasiment chaque objet à connaître tous les autres objets du système. Une conception avec une telle quantité de liaisons peut s’avérer être de piètre qualité car elle suppose un couplage très fort entre les objets. Chaque objet ne pouvant travailler sans les autres, le système devient rapidement monolithique, devenant de plus en plus difficile à maintenir et à faire évoluer. De surcroît, pour adapter et modifier le comportement d’une petite partie du système, il devient nécessaire de définir de nombreuses sous-classes.
Les interfaces graphiques dynamiques sont un bon exemple d’un tel système. Une modification de la valeur d’un contrôle graphique peut conduire à modifier l’aspect d’autres contrôles graphiques comme, par exemple :
-
Devenir visible ou masqué.
-
Modifier le nombre de valeurs possibles (pour un menu).
-
Changer le format des valeurs à saisir.
La première possibilité est donc de lier chaque contrôle aux contrôles dont l’aspect change en fonction de sa valeur. Elle a ses limites.
L’autre...
Structure
1. Diagramme de classes
La figure 22.3 détaille la structure générique du design pattern Mediator.
Figure 22.3 - Structure du design pattern Mediator
2. Participants
Les participants au design pattern Mediator sont les suivants :
-
Mediateur définit l’interface du médiateur pour les objets Element.
-
MédiateurConcret (Formulaire) implémente la coordination entre les éléments et gère les associations avec les éléments.
-
Element (AbstractControle) est la classe abstraite des éléments qui contient leurs attributs, associations et méthodes communes.
-
ÉlémentConcret1 et ÉlémentConcret2 (PopupMenu, ZoneSaisie et Bouton) sont les classes concrètes des éléments qui communiquent avec le médiateur au lieu de communiquer avec les autres éléments.
3. Collaborations
Les éléments envoient des messages au médiateur et en reçoivent. Le médiateur implémente la collaboration et la coordination entre les éléments.
Domaines d’application
Le design pattern Mediator est utilisé dans les cas suivants :
-
Un système est formé d’un ensemble d’objets basé sur une communication complexe conduisant à associer de nombreux objets entre eux.
-
Les objets d’un système sont difficiles à réutiliser car ils possèdent de nombreuses associations avec d’autres objets.
-
La modularité d’un système est médiocre, obligeant dans le cas d’une adaptation d’une partie du système à écrire de nombreuses sous-classes.
Exemple en PHP
Nous proposons de simuler la saisie d’un formulaire à l’aide d’entrées/sorties classiques en bouclant sur une saisie séquentielle de chaque contrôle jusqu’à ce que le bouton « OK » soit validé (au clavier). Un menu permet de choisir si l’emprunt se fait avec ou sans co-emprunteur.
Le code PHP de la classe AbstractControle est écrit à la suite.
<?php
declare(strict_types=1);
namespace ENI\DesignPatterns\Mediator;
abstract class AbstractControle
{
protected ?string $valeur = null;
protected Formulaire $directeur;
protected string $nom;
public function __construct(string $nom)
{
$this->nom = $nom;
}
public function getNom(): string
{
return $this->nom;
}
protected function setNom(string $nom): void
{
$this->nom = $nom;
}
protected function getDirecteur(): Formulaire
{
return $this->directeur;
}
public function setDirecteur(Formulaire $directeur): void
{
$this->directeur = $directeur;
}
public function getValeur(): ?string
{
return $this->valeur;
}
protected function setValeur(string $valeur): void
{
$this->valeur = $valeur;
}
protected function modifie(): void
{
$this->getDirecteur()->controleModifie($this);
}
abstract public function saisie(): void;
}
Le code source de la sous-classe ZoneSaisie est le suivant. La méthode saisie est très simple, elle lit la valeur de la zone au clavier et la stocke dans...