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
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Design Patterns en Java
  3. Le pattern Mediator
Extrait - Design Patterns en Java Descriptions et solutions illustrées en UML 2 et Java (5e édition) - Les 23 modèles de conception
Extraits du livre
Design Patterns en Java Descriptions et solutions illustrées en UML 2 et Java (5e édition) - Les 23 modèles de conception Revenir à la page d'achat du livre

Le pattern Mediator

Description

Le pattern Mediator a pour but de construire un objet dont la vocation est la gestion et le contrôle des interactions dans un ensemble d’objets sans que ses éléments doivent se connaître mutuellement.

Exemple

La conception par objets favorise la distribution du comportement entre les objets du système. 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 mauvaise qualité. En effet, la modularité et les possibilités de réutilisation des objets sont alors réduites. Chaque objet ne peut pas travailler sans les autres et le système devient monolithique, perdant toute modularité. 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 utilisateur 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. Cette possibilité présente les inconvénients...

Structure

1. Diagramme de classes

La figure 4-6.3 détaille la structure générique du pattern.

images/figure22-3.png

Figure 4-6.3 - Structure du pattern Mediator

2. Participants

Les participants au pattern sont les suivants :

  • Médiateur définit l’interface du médiateur pour les objets Élément.

  • MédiateurConcret (Formulaire) implante la coordination entre les éléments et gère les associations avec les éléments.

  • Élément (Contrôle) est la classe abstraite des éléments qui introduit 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 implante la collaboration et la coordination entre les éléments.

Domaines d’application

Le pattern 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 Java

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

Le code Java de la classe Controle s’écrit à la suite.

public abstract class Controle  
{  
  protected String valeur = "";  
  protected Formulaire directeur;  
  protected String nom;  
  
  public Controle(String nom)  
  {  
    setNom(nom);  
  }  
  
  public String getNom()  
  {  
    return nom;  
  }  
  
  protected void setNom(String nom)  
  {  
    this.nom = nom;  
  }  
    
  protected Formulaire getDirecteur()  
  {  
    return directeur;  
  }  
  
  public void setDirecteur(Formulaire directeur)  
  {  
    this.directeur = directeur;  
  }  
  
  public String getValeur()  
  {  
    return valeur;  
  }  
    
  protected void setValeur(String valeur)  
  {  
    this.valeur = valeur;  
  }  
  
  public abstract void saisie();  
  
  protected void modifie()  
  {  
    getDirecteur().controleModifie(this);  
  }  
} 

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.

import java.util.*; 
public class ZoneSaisie extends Controle 
{ 
  Scanner reader = new Scanner(System.in); 
 
  public ZoneSaisie(String nom) 
  { ...