Les bases des décorateursAperçu du pattern décorateurPour commencer, nous allons voir un epu de théorie sur » le pattern décorateur . Une technique consiste à définir une interface commune que les objets originaux et les décorateurs implémentent; les décorateurs ayant comme dépendance les objets originaux, ils vont alors pouvoir redéfinir ou proxier les appels à leurs méthodes. Voyons un peu de code afin de mieux comprendre:
Nous créons un objet de type StandardWindow, le passons au constructeur de LockedWindow, et le comportement de notre fenêtre a maintenant changé. Le point fort ici est que nous n'avons pas besoin d'implémenter une fonctionnalité de verrou ("lock") dans l'objet de base (StandardWindow) -- le décorateur s'occupe de cela. En plus, vous pouvez utiliser votre fenêtre décorée à la place de la fenêtre standard : elles implémentent la même interface. Une utilisation particulièrement pratique du pattern décorateur est pour tout ce qui concerne la représentation des objets. Par exemple un objet "Personne" qui en lui-même n'a aucune représentation textuelle. Grâce au pattern décorateur, vous pouvez créer un objet qui va agir comme une Personne mais qui pourra aussi représenter textuellement cette Personne. Dans cet exemple particulier, nous allons utiliser le» duck typing plutôt qu'une interface explicite. Ceci permet à notre implémentation d'être un peu plus fléxible tout en gardant l'utilisation de la décoration intacte.
Dans cet exemple, nous passons une instance Person au constructeur de TextPerson. Grâce à la surcharge des méthodes, nous pouvons continuer d'appeler les méthodes de Person -- affecter un nom, un prénom, ... -- mais nous pouvons en plus récupérer une représentation sous forme de chaine grâce à __toString(). Cet exemple est proche du fonctionnement interne des décorateurs de Zend_Form. La différence est qu'au lieu que le décorateur n'encapsule l'objet initial, c'est l'objet élément qui possède en lui un ou plusieurs decorateurs à qui il passe lui-même pour effectuer le rendu visuel. Les décorateurs peuvent ainsi accéder à l'élément et en créer une représentation. Créer votre premier décorateurLes décorateurs de Zend_Form implémentent tous, Zend_Form_Decorator_Interface. Cette interface permet de régler les options du décorateur, enregistrer en lui l'élément ainsi qu'effectuer le rendu. YUne classe de base, Zend_Form_Decorator_Abstract, propose une implémentation de cette logique de base dont vous aurez besoin, à l'exception du rendu que vous devrez définir. Imaginons une situation dans laquelle nous souhaitons simplement rendre un élément comme un tag html text avec un libéllé(label). Juste la base, nous verrons plus tard la gestion des erreurs et les éventuels autres tags html. Un tel décorateur pourrait ressembler à ça:
Créons un élément qui utilise ce décorateur: Le visuel de cet élément donne:
Nous pourrions aussi ranger cette classe dans un dossier de librairie, il faut alors informer l'élément du chemin vers ce dossier, et ensuite faire référence au décorateur comme "SimpleInput": Ceci permet de partager du code entre projets et ouvre aussi la possibilité d'étendre dans le futur les classes rangées. Dans le chapitre suivant, nous allons voir comment combiner les décorateurs afin de créer un affichage par morceaux (composite).
|