Design patterns: Adapter
Il pattern Adapter consente a interfacce incompatibili di lavorare insieme.
Caratteristiche dell’Adapter pattern
- Compatibilità tra Interfacce: L’Adapter Pattern permette di adattare un’interfaccia esistente a un’altra interfaccia che il client si aspetta, rendendo classi incompatibili in grado di lavorare insieme.
- Separazione delle Responsabilità: Favorisce la separazione tra il codice client e le classi che devono essere adattate. Il client non deve modificare il proprio codice per utilizzare le classi adattate.
- Riutilizzo del Codice Esistente: Consente di riutilizzare classi esistenti senza modificarle, facilitando l’integrazione di nuove funzionalità in un’applicazione.
- Flessibilità: Gli adapter possono essere facilmente creati per adattare nuove classi, rendendo l’applicazione flessibile e facilitando l’integrazione di diversi componenti.
- Interfaccia Uniforme: Fornisce un’interfaccia uniforme che maschera la complessità delle classi sottostanti, semplificando l’interazione tra il client e le classi adattate.
- Possibilità di Adattare Diversi Tipi di Classi: Può adattare sia classi che interfacce, consentendo di lavorare con vari tipi di componenti, inclusi oggetti esterni o librerie di terze parti.
- Sviluppo Incrementale: Facilita un approccio di sviluppo incrementale, permettendo di aggiungere nuove funzionalità o componenti senza dover ristrutturare l’intero sistema.
- Adattamento di Comportamenti: Oltre a convertire le interfacce, gli adapter possono anche modificare o estendere il comportamento degli oggetti adattati, consentendo una maggiore personalizzazione.
Esempio in PHP:
class OldPaymentSystem {
public function pay() {
return "Pagamento con il vecchio sistema.";
}
}
interface NewPaymentInterface {
public function processPayment();
}
class PaymentAdapter implements NewPaymentInterface {
private $oldSystem;
public function __construct(OldPaymentSystem $oldSystem) {
$this->oldSystem = $oldSystem;
}
public function processPayment() {
return $this->oldSystem->pay(); // Adattiamo il vecchio metodo al nuovo sistema.
}
}
// Utilizzo
$oldPayment = new OldPaymentSystem();
$adapter = new PaymentAdapter($oldPayment);
echo $adapter->processPayment();