Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à 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 Chain of Responsibility
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 Chain of Responsibility

Description

Le pattern Chain of Responsibility construit une chaîne d’objets telle que si un objet de la chaîne ne peut pas répondre à une requête, il puisse la transmettre à son successeur et ainsi de suite jusqu’à ce que l’un des objets de la chaîne y réponde.

Exemple

Nous nous plaçons dans le cadre de la vente de véhicules d’occasion. Lorsque le catalogue de ces véhicules est affiché, l’utilisateur peut demander une description de l’un des véhicules mis en vente. Si une telle description n’a pas été fournie, le système doit alors renvoyer la description associée au modèle de ce véhicule. Si à nouveau, cette description n’a pas été fournie, il convient de renvoyer la description associée à la marque du véhicule. Une description par défaut est renvoyée s’il n’y a pas non plus de description associée à la marque.

Ainsi, l’utilisateur reçoit la description la plus précise qui est disponible dans le système.

Le pattern Chain of Responsibility fournit une solution pour mettre en œuvre ce mécanisme. Celle-ci consiste à lier les objets entre eux du plus spécifique (le véhicule) au plus général (la marque) pour former la chaîne de responsabilité. La requête de description est transmise le long de cette chaîne jusqu’à ce qu’un objet puisse la traiter et renvoyer la description.

Le diagramme d’objets UML de la figure 4-2.1 illustre cette situation et montre les différentes chaînes de responsabilité...

Structure

1. Diagramme de classes

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

images/figure18-4.png

Figure 4-2.4 - Structure du pattern Chain of Responsibility

2. Participants

Les participants au pattern sont les suivants :

  • Gestionnaire (ObjetBase) est une classe abstraite qui implante sous forme d’une association la chaîne de responsabilité ainsi que l’interface des requêtes.

  • GestionnaireConcret1 et GestionnaireConcret2 (Véhicule, Modèle et Marque) sont les classes concrètes qui implantent le traitement des requêtes en utilisant la chaîne de responsabilité si elles ne peuvent pas les traiter.

  • Client (Utilisateur) initie la requête initiale auprès d’un objet de l’une des classes GestionnaireConcret1 ou GestionnaireConcret2.

3. Collaborations

Le client effectue la requête initiale auprès d’un gestionnaire. Cette requête est propagée le long de la chaîne de responsabilité jusqu’au moment où l’un des gestionnaires la traite.

Domaines d’application

Le pattern est utilisé dans les cas suivants :

  • Une chaîne d’objets gère une requête selon un ordre qui est défini dynamiquement.

  • La façon dont une chaîne d’objets gère une requête ne doit pas être connue de ses clients.

Exemple en Java

Nous introduisons maintenant l’exemple en langage Java. La classe ObjetBase est décrite à la suite. Elle implante la chaîne de responsabilité par l’attribut suivant dont la valeur peut être fixée par la méthode setSuivant. Les autres méthodes correspondent aux spécifications introduites dans la figure 4-2.2.

public abstract class ObjetBase  
{  
  protected ObjetBase suivant;  
  
  private String descriptionParDefaut()  
  {  
    return "description par defaut";  
  }  
  
  protected abstract String getDescription();  
  
  public String donneDescription()  
  {  
    String resultat;  
    resultat = this.getDescription();  
    if (resultat != null)  
      return resultat;  
    if (suivant != null)  
      return suivant.donneDescription();  
    else  
      return this.descriptionParDefaut();  
  }  
  
  public void setSuivant(ObjetBase suivant)  
  {  
    this.suivant...