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?

 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *