Sobes.tech
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;
    }
}