Design Patterns: Decorator en PHP
Dans le pattern Decorator, une classe ajoutera des fonctionnalités à une autre classe, sans changer la structure des autres classes.
Exemple :
Dans cet exemple, la classe SubjetcForum aura son titre affiché de différentes manières par la classe SubjectTitleDecorator et sa classe fille SolvedSubjectDecorator. La classe SolvedSubjectDecorator ajoute le préfixe [Résolu] devant le titre si le sujet est résolu.
<?php class SubjetcForum { private $author; private $title; function __construct($a, $t) { $this->author = $a; $this->title = $t; } function getAuthor() { return $this->author; } function getTitle() { return $this->title; } } class SubjectTitleDecorator { protected $subject; protected $title; public function __construct(SubjetcForum $s) { $this->subject = $s; $this->resetTitle(); } //cela ne modifie pas l'objet original function resetTitle() { $this->title = $this->subject->getTitle(); } function displayTitle() { return $this->title; } } class SolvedSubjectDecorator extends SubjectTitleDecorator { private $sub; public function __construct(SubjectTitleDecorator $std) { $this->sub = $std; } function addSolved() { $this->sub->title = "[Résolu]" . $this->sub->title; } } // client $subject = new SubjetcForum('Comment implémenter le design pattern Decorator?'); $decorator = new SubjectTitleDecorator($subject); $solvedSubjectDecorator = new SolvedSubjectDecorator($decorator); print('Title : '. $decorator->displayTitle() ."<br>"); print('Afficher le titre après que le sujet est résolu : '); $solvedSubjectDecorator->addSolved(); print($decorator->displayTitle()."<br>"); print('Afficher le titre après la réinitialisation: '); $decorator->resetTitle(); print($decorator->displayTitle()); ?>
Sortie:
Title : Comment implémenter le design pattern Decorator? Afficher le titre aprés que le sujet est résolu : [Résolu] Comment implémenter le design pattern Decorator? Afficher le titre aprés la réinitialisation: Comment implémenter le design pattern Decorator?