Sobes.tech
Middle+

Qual è la differenza tra i pattern 'adapter' e 'decoratore'?

sobes.tech AI

Risposta dell'AI

Adapter trasforma l'interfaccia di una classe nell'interfaccia attesa da un'altra classe, garantendo la compatibilità tra classi con interfacce incompatibili. Cambia la firma dei metodi esistenti per adattarli alla nuova interfaccia.

Decoratore aggiunge dinamicamente nuove responsabilità a un oggetto avvolgendolo in un decoratore. Non modifica l'interfaccia dell'oggetto decorato, ma ne amplia semplicemente la funzionalità.

Criterio Adapter Decoratore
Obiettivo Compatibilità delle interfacce Estensione della funzionalità
Cambio di interfaccia Sì, trasforma una in un'altra No, mantiene quella esistente
Struttura Avvolge l'oggetto adattato Avvolge l'oggetto decorato
Comportamento Cambia le chiamate all'oggetto adattato Aggiunge nuove azioni o modifica quelle esistenti
Esempio Trasformazione XML in JSON Aggiunta di logging a una classe esistente
<?php

// Esempio di Adapter
interface TargetInterface {
    public function request();
}

class Adaptee {
    public function specificRequest() {
        echo "Richiesta specifica di Adaptee" . PHP_EOL;
    }
}

class Adapter implements TargetInterface {
    private $adaptee;

    public function __construct(Adaptee $adaptee) {
        $this->adaptee = $adaptee;
    }

    public function request() {
        // Trasformazione della chiamata
        $this->adaptee->specificRequest();
    }
}

// Esempio di Decoratore
interface Component {
    public function operation();
}

class ConcreteComponent implements Component {
    public function operation() {
        echo "Operazione del componente concreto" . 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 "Comportamento aggiunto A" . PHP_EOL;
    }
}