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


