Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Du 22 au 24 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !
  1. Livres et vidéos
  2. Design Patterns en PHP
  3. Le design pattern Mediator
Extrait - Design Patterns en PHP Les 23 modèles de conception : descriptions et solutions illustrées en UML2 et PHP (2e édition)
Extraits du livre
Design Patterns en PHP Les 23 modèles de conception : descriptions et solutions illustrées en UML2 et PHP (2e édition)
2 avis
Revenir à la page d'achat du livre

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.

Structure 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...