Sobes.tech
Junior

Cos'è il pattern Adapter?

sobes.tech AI

Risposta dell'AI

Il pattern Adapter (Adapter Pattern) è un pattern strutturale di progettazione che consente a classi con interfacce incompatibili di lavorare insieme. Funziona come una copertura che trasforma l'interfaccia di una classe in un'altra attesa dal cliente.

Applicazioni:

  • Integrazione di librerie di terze parti con interfacce incompatibili.
  • Uso di classi esistenti in nuovi sistemi senza modificarle.
  • Garantire l'interazione tra classi sviluppate indipendentemente.

Esempio di implementazione (adattatore oggetto):

Supponiamo che esista una classe LegacyService con un metodo oldRequest():

class LegacyService {
    public void oldRequest() {
        // codice vecchio
    }
}

E una nuova interfaccia NewService con un metodo newRequest():

interface NewService {
    void newRequest();
}

L'adattatore ServiceAdapter implementa NewService e contiene un riferimento a LegacyService:

class ServiceAdapter implements NewService {
    private LegacyService legacyService;

    public ServiceAdapter(LegacyService legacyService) {
        this.legacyService = legacyService;
    }

    @Override
    public void newRequest() {
        // Trasformazione della chiamata del nuovo metodo in quella vecchia
        legacyService.oldRequest();
    }
}

Il cliente può usare LegacyService tramite l'interfaccia NewService:

NewService service = new ServiceAdapter(new LegacyService());
service.newRequest(); // Chiamerà oldRequest() in LegacyService

Esiste anche una variante chiamata adattatore di classe, che utilizza l'ereditarietà multipla (se supportata dal linguaggio) o l'ereditarietà dalla classe da adattare e l'implementazione dell'interfaccia di destinazione. In Java, a causa dell'assenza di ereditarietà multipla, si realizza tramite ereditarietà dalla classe adattabile e implementazione dell'interfaccia dell'adattatore, ma questo approccio è meno flessibile. L'adattatore oggetto è preferibile perché permette di adattare le sottoclassi ed evitare un legame rigido.

Vantaggi:

  • Permette il riutilizzo di classi incompatibili.
  • Incapsula i dettagli della trasformazione delle interfacce.
  • Aumenta la flessibilità del sistema.

Svantaggi:

  • Può aumentare la complessità aggiungendo una nuova classe.
  • La performance può diminuire leggermente a causa di un livello di astrazione aggiuntivo.