Le motif iterator-composite

Définition

C’est un motif dit composé. En effet, comme son nom l’indique, c’est l’utilisation conjointe du motif iterator et du motif composite.

Principe

Le principe est assez simple. L’association de ces deux motifs doit permettre de parcourir les éléments composés via un iterateur.

L’exemple par le code

Ce genre de situation se présente bien souvent dans le cas de parcour d’arbre (mais on peut surement l’utiliser dans plein d’autres cas).

Voici donc une description de l’element que nous allons manipuler:

 module Element 
   attr_reader :name
   def add_element(element)
     @element_list.push(element)
   end
   def remove_element(element)
     @element_list.remove(element)
   end
   def get_child(i=0)
     @element_list[i]
   end
   def show
     raise Exception.new("Undefined method")
   end
 end

La methode show lève une exception “undedined metod” car c’est au objets incluant ce module de définir son comportement.

définisons ensuite le noeud et l’attribut

 class Node 
   include Element
   def initialize(name="")
     @name=name
     @element_list=[]
   end
   def show
     puts @name
     @element_list.each do |element|
       element.show
     end
   end
 end 

 class Attribute 
   include Element
   def initialize(name="",value="")
     @name=name
     @value=value
   end
   def show
     print @name + " : " + @value + "\n" 
   end
 end

Le noeud (node) utilise dans la methode show un iterateur simple, celui fourni par ruby, la method each disponible sur tout objet incluant le module Enumerable . Comme je l’ai déjà signaler dans l’article sur le motif ierator, l’utilisation de cette methode est dans la plupart des cas suffissante, mais l’écriture d’un itérateur maison est parfois nécessaire.

Voyons maintenant ce que cela donne:

 root = Node.new("racine")
 e1 = Node.new("element1")
 e2 = Node.new("element2")
 a3 = Attribute.new("attribute3", "test valeur 3")
 a4 = Attribute.new("attribute4", "test valeur 4")
 e5 = Node.new("element5")
 root.add_element(e1)
 root.add_element(e2)
 e2.add_element(a3)
 e2.add_element(a4)
 e2.add_element(e5)

 root.show

La method show affiche:

 racine
 element1
 element2
 attribute3 : test valeur 3
 attribute4 : test valeur 4
 element5