Adapter

L’adapter è un pattern di tipo strutturale, noto anche con il nome di wrapper, il cui scopo è quello di fornire una soluzione astratta al problema dell’interoperabilità tra interfacce differenti. Il pattern adapter punta a risolvere le problematiche che si verificano quando, durante il processo di modifica di un software pre-esistente, ci si trova ad utilizzare sistemi di supporto (come per esempio librerie o altri componenti) la cui interfaccia non è perfettamente compatibile con quanto richiesto dall’applicazione.

Invece di riscrivere parte del sistema, compito oneroso e non sempre possibile se non si ha a disposizione il codice sorgente, può essere più comodo e facile scrivere un adapter (adattatore) in grado di fare da tramite tra i due componenti.

Esistono due possibili implementazioni distinte per il pattern adapter: nella prima versione (Object Adapter) le classi Client e Adaptee rappresentano le due componenti che non sono in grado di comunicare autonomamente tra loro e che necessitano quindi dell’introduzione di un adattatore. Il client è predisposto ad utilizzare una certa interfaccia (specificata dall’interfaccia Target), l’Adaptee tuttavia è predisposto a fornire un’interfaccia differente. Per risolvere il problema viene quindi introdotto un Adapter, esso implementerà (erediterà) l’interfaccia richiesta dalla classe Client, per questo sarà da lui utilizzabile e conterrà (aggregazione o associazione) un oggetto di tipo Adaptee.

Nella seconda versione (Class Adapter) si dispone di una classe Client, di una certa classe legacy (precedente e non più in uso) che era in grado di fornire alcune operazioni e di una classe Adaptee che siamo interessati ad integrare all’interno del progetto. Per permette la comunicazione occorre inserire una nuova classe Adapter, costruita in modo tale che possa ereditare da entrambe le classi (ereditarietà multipla). Così facendo potremmo rimappare alcune delle funzioni di Target su funzioni più moderne sviluppate da Adaptee.