Chaîne de responsabilité (Chain Of Responsibility)
DéfinitionPermettre à 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
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) ;