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?

