Le motif décorateur
Définition
Il n’y a pas que l’héritage dans la vie objet. Ce motif viens nous montrer comment utiliser le principe de composition pour modifier nos objet au moment de l’éxécution.
Principe
Modifier dynamiquement le comportement et/ou les responsabilités d’un objet. C’est une bonne alternative à l’héritage. le motif permettra plus de souplesse pour enrichir les fonctionnalités d’un objet.
L’exemple par le code
Nous allons parti d’un exemple simple, un décorateur de texte. Vous comprendrez en les lisant (si j’ai été assez clair ;-) ) tout l’interêt du motifs décorateur.
Commençons donc par écrire un objet qui contiendra notre morceau de texte
class Texte
def initialize(s)
@texte = s
end
def to_s
@texte
end
end
Réalisons maintenant le module de décoration Decorateur. Il définit simplement le constructeur utilisé par les objets de décoration. C’est à dire une méthode initialize qui prend comme paramètre un objet Texte
module Decorateur
def initialize(texte)
@texte = texte
end
end
Nous allons maintenant écrire deux décorateurs, ils nous servirons pour modifier l’apparence de notre texte. Bien entendu ils doivent inclure le module de décoration Decorateur. C’est lui qui force leur initialisation.
class Gras
include Decorateur
def to_s
"<strong> " + @texte.to_s + "</strong>"
end
end
class Italique
include Decorateur
def to_s
"<em>" + @texte.to_s + "</em>"
end
end
Ecrivons maintenant de quoi tester notre code:
texte1 = Texte.new("ruby est magique")
puts texte1.to_s # -> ruby est magique
texte2 = Gras.new(texte1)
puts texte2.to_s # -> <strong> ruby est magique</strong>
texte3 = Italique.new(texte2)
puts texte3.to_s # -> <em><strong> ruby est magique</strong></em>
puts texte1.to_s # -> ruby est magique
texte4 = Texte.new("vive ruby !")
texte5 = Italique.new(texte4)
puts texte5.to_s # -> <em>vive ruby !</em>


