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>