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;
}
}