Design Pattern Hierarchical Visitor

Nous venons de voir le Design Pattern Visitor. Mais celui ci à quelques limitations. Le pattern Hierarchical Visitor corrige une grande partie de ces lacunes. Voyons ensemble ce design.

Pour reprendre en substance l’article de RobertDiFalco, les avantages par rapport au design pattern visitor sont :

  • Apport du concept de profondeur alors que le traditionnel Visitor n’a pas ce concept : il n’est pas possible de déterminer avec un Visitor classique si un composite est le fils d’un autre ou son parent. Nous ajoutons ici une navigation hierachisée.
  • Apport d’une navigation conditionnelle permettant de couper des branches de l’abre si un noeud ne correspond pas aux critères de recherche. Le visitor classique, lui, parcours l’arbre en entier même si le noeud recherché a déjà été trouvé. Il explore une branche complète même si un critère nous permet à coup sûr d’écarter la branche de notre recherche.

Nous devons donc modifier notre Visitor pour lui ajouter deux méthodes :

  1. public interface Visitor {
  2.  boolean visitEnter( Composite node ); // going into a branch
  3.  boolean visitLeave( Composite node ); // coming out
  4.  boolean visit( Leaf node );
  5. }

Cela entraine la modification des méthodes accept de nos objets : on ne doit visiter les noeuds fils que si visitEnter est vrai. Et nous devons arreter la recherche de ce niveau si visitLeave renvoit faux.

Cela permet les cas d’utilisation suivants :

  • ne pas explorer les fils d’un noeud si une condition permet de couper la branche.
  • arrêter d’explorer un niveau de l’arbre si une condition permet d’exclure les frères du noeud courant.

Ce qui donne les méthodes suivantes :

  1. boolean accept( Visitor v ) {
  2.  // enter this node?
  3.  if (v.visitEnter(this)) {
  4.   Iterator at = m_children.iterator();
  5.   while ( at.hasNext() )
  6.   if ( ! ((Component)at.next()).accept( v ) )
  7.    break;
  8.  }
  9.  return v.visitLeave( this );
  10. }

Le commentaires sont fermés.