Chaîne de responsabilité (Chain Of Responsibility)

Définition

Permettre à plus d'un objet (handler) de manipuler l'objet d'origine (request). D'abord créer la chaîne composée d'objet handler, puis passer l'objet request à celle-ci jusqu'à ce qu'un objet la manipule.

Une variante consiste à traiter l'objet et à le passer plus loin dans la chaîne.

Diagramme de classe

Diagramme de classe pattern COR

Intervenants

Les classes et/ou objets qui participent à ce pattern sont:

Handler

  • Définit une interface pour traiter l'objet à traiter.
  • Optionnellement, implémente les liens entre Handler (sucessor)

ConcreteHandler

  • Implémente un traitement spécifique à sa responsabilité.
  • Traite les objets pour lesquels il a la responsabilité de traitement.
  • Fais suivre la requête à son successeur dans la chaîne si nécessaire.

Client

  • Initialise les objets handler de la chaîne de responsabilité et les lie entre eux (sucessor)
  • Appel la méthode de traitement du premier objet de la chaîne de responsabilité.

Exemple Concret

Handler

public interface IHandler {

  public void SetSuccessor(IHandler pSuccessor) ;
  
  public void traiteObjet(MonObjet monObjet) ;
}
public abstract class AbstractHandler implements IHandler {
  
  protected IHandler successor;

  public void SetSuccessor(IHandler pSuccessor) {
    this.successor = pSuccessor;
  }

  public abstract void traiteObjet(MonObjet monObjet) ;
}

ConcreteHandler

public class ConcreteHandler extends AbstractHandler {

  public void traiteObjet(MonObjet monObjet) {

    //Traitement spécifique à l'objet (optionnel)
    doIt(monObjet) ;
	
    if (monObjet.getEtat().equals("OK")) {
      //Traitement et fin de la chaîne
      doItAndStop(monObjet) ;
    }
    else {
      //Si un successeur existe, passage de l'objet.
      if (this.successor != null) {
        this.successor.traiteObjet(monObjet) ;
      }
    }
  }

Client

...

//Chain of responsibility
IHandler concreteHandler1 = new concreteHandler1() ;
IHandler concreteHandler2 = new concreteHandler2() ;
IHandler concreteHandler3 = new concreteHandler3() ;
    
concreteHandler1.SetSuccessor(concreteHandler2) ;
concreteHandler2.SetSuccessor(concreteHandler3) ;
		
MonObjet monObjet = new MonObjet("Vuissoz", "Jean-Noël", "10.10.1977") ;
    
concreteHandler1.traiteObjet(monObjet) ;