Middle+
Quelle est la différence entre les modèles 'adaptateur' et 'décorateur' ?
sobes.tech IA
Réponse de l'IA
Adaptateur transforme l'interface d'une classe en l'interface attendue par une autre classe, assurant la compatibilité entre des classes avec des interfaces incompatibles. Modifie la signature des méthodes existantes pour correspondre à la nouvelle interface.
Décorateur ajoute dynamiquement de nouvelles responsabilités à un objet en l'enveloppant dans un décorateur. Ne modifie pas l'interface de l'objet décoré, mais étend simplement sa fonctionnalité.
| Critère | Adaptateur | Décorateur |
|---|---|---|
| Objectif | Compatibilité des interfaces | Extension de la fonctionnalité |
| Changement d'interface | Oui, transforme une en une autre | Non, conserve l'existante |
| Structure | Enveloppe l'objet adapté | Enveloppe l'objet décoré |
| Comportement | Modifie les appels à l'objet adapté | Ajoute de nouvelles actions ou modifie celles existantes |
| Exemple | Transformation XML en JSON | Ajout de journalisation à une classe existante |
<?php
// Exemple d'Adaptateur
interface TargetInterface {
public function request();
}
class Adaptee {
public function specificRequest() {
echo "Requête spécifique d'Adaptee" . PHP_EOL;
}
}
class Adapter implements TargetInterface {
private $adaptee;
public function __construct(Adaptee $adaptee) {
$this->adaptee = $adaptee;
}
public function request() {
// Transformation de l'appel
$this->adaptee->specificRequest();
}
}
// Exemple de Décorateur
interface Component {
public function operation();
}
class ConcreteComponent implements Component {
public function operation() {
echo "Opération du composant concret" . PHP_EOL;
}
}
class Decorator implements Component {
protected $component;
public function __construct(Component $component) {
$this->component = $component;
}
public function operation() {
$this->component->operation();
}
}
class ConcreteDecoratorA extends Decorator {
public function operation() {
parent::operation();
$this->addedBehaviorA();
}
private function addedBehaviorA() {
echo "Comportement ajouté A" . PHP_EOL;
}
}