Il pattern adattatore in Java

1. Panoramica

In questo breve tutorial, daremo uno sguardo al pattern Adapter e alla sua implementazione Java.

2. Modello adattatore

Un pattern Adapter funge da connettore tra due interfacce incompatibili che altrimenti non possono essere collegate direttamente. Un adattatore avvolge una classe esistente con una nuova interfaccia in modo che diventi compatibile con l'interfaccia del client.

Il motivo principale dietro l'utilizzo di questo modello è convertire un'interfaccia esistente in un'altra interfaccia che il cliente si aspetta. Di solito viene implementato una volta progettata l'applicazione.

2.1. Esempio di modello adattatore

Considera uno scenario in cui è presente un'app sviluppata negli Stati Uniti che restituisce la velocità massima delle auto di lusso in miglia orarie (MPH). Ora dobbiamo utilizzare la stessa app per il nostro cliente nel Regno Unito che vuole gli stessi risultati ma in chilometri orari (km / h).

Per affrontare questo problema, creeremo un adattatore che convertirà i valori e ci darà i risultati desiderati:

Per prima cosa, creeremo l'interfaccia originale Movable che dovrebbe restituire la velocità di alcune auto di lusso in miglia all'ora:

public interface Movable { // returns speed in MPH double getSpeed(); }

Creeremo ora un'implementazione concreta di questa interfaccia:

public class BugattiVeyron implements Movable { @Override public double getSpeed() { return 268; } }

Ora creeremo un'interfaccia adattatore MovableAdapter che sarà basata sulla stessa classe Movable . Può essere leggermente modificato per produrre risultati diversi in diversi scenari:

public interface MovableAdapter { // returns speed in KM/H double getSpeed(); } 

L'implementazione di questa interfaccia consisterà nel metodo privato convertMPHtoKMPH () che verrà utilizzato per la conversione:

public class MovableAdapterImpl implements MovableAdapter { private Movable luxuryCars; // standard constructors @Override public double getSpeed() { return convertMPHtoKMPH(luxuryCars.getSpeed()); } private double convertMPHtoKMPH(double mph) { return mph * 1.60934; } }

Ora useremo solo i metodi definiti nel nostro adattatore e otterremo le velocità convertite. In questo caso, sarà vera la seguente affermazione:

@Test public void whenConvertingMPHToKMPH_thenSuccessfullyConverted() { Movable bugattiVeyron = new BugattiVeyron(); MovableAdapter bugattiVeyronAdapter = new MovableAdapterImpl(bugattiVeyron); assertEquals(bugattiVeyronAdapter.getSpeed(), 431.30312, 0.00001); }

Come possiamo notare qui, il nostro adattatore converte 268 mph in 431 km / h per questo caso particolare.

2.2. Quando utilizzare il modello adattatore

  • Quando un componente esterno fornisce funzionalità accattivanti che vorremmo riutilizzare, ma è incompatibile con la nostra applicazione corrente . È possibile sviluppare un adattatore adatto per renderli compatibili tra loro
  • Quando la nostra applicazione non è compatibile con l'interfaccia che il nostro cliente si aspetta
  • Quando vogliamo riutilizzare il codice legacy nella nostra applicazione senza apportare alcuna modifica al codice originale

3. Conclusione

In questo articolo, abbiamo esaminato il modello di progettazione dell'adattatore in Java.

Il codice sorgente completo per questo esempio è disponibile su GitHub.