Das Adaptermuster in Java

1. Übersicht

In diesem kurzen Tutorial sehen wir uns das Adaptermuster und seine Java-Implementierung an.

2. Adaptermuster

Ein Adaptermuster fungiert als Konnektor zwischen zwei inkompatiblen Schnittstellen, die ansonsten nicht direkt verbunden werden können. Ein Adapter umschließt eine vorhandene Klasse mit einer neuen Schnittstelle, damit sie mit der Clientschnittstelle kompatibel wird.

Das Hauptmotiv für die Verwendung dieses Musters besteht darin, eine vorhandene Schnittstelle in eine andere Schnittstelle zu konvertieren, die der Client erwartet. Es wird normalerweise implementiert, sobald die Anwendung entworfen wurde.

2.1. Beispiel für ein Adaptermuster

Stellen Sie sich ein Szenario vor, in dem es eine in den USA entwickelte App gibt, die die Höchstgeschwindigkeit von Luxusautos in Meilen pro Stunde (MPH) zurückgibt. Jetzt müssen wir für unseren Kunden in Großbritannien dieselbe App verwenden, die dieselben Ergebnisse erzielt, jedoch in Stundenkilometern (km / h).

Um dieses Problem zu beheben, erstellen wir einen Adapter, der die Werte konvertiert und die gewünschten Ergebnisse liefert:

Zuerst erstellen wir die ursprüngliche Schnittstelle Movable, die die Geschwindigkeit einiger Luxusautos in Meilen pro Stunde zurückgeben soll:

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

Wir werden nun eine konkrete Implementierung dieser Schnittstelle erstellen:

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

Jetzt erstellen wir eine Adapterschnittstelle MovableAdapter , die auf derselben Movable- Klasse basiert . Es kann leicht modifiziert werden, um in verschiedenen Szenarien unterschiedliche Ergebnisse zu erzielen:

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

Die Implementierung dieser Schnittstelle besteht aus der privaten Methode convertMPHtoKMPH () , die für die Konvertierung verwendet wird:

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

Jetzt verwenden wir nur die in unserem Adapter definierten Methoden und erhalten die konvertierten Geschwindigkeiten. In diesem Fall ist die folgende Behauptung wahr:

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

Wie wir hier sehen können, konvertiert unser Adapter für diesen speziellen Fall 268 mph auf 431 km / h .

2.2. Wann wird das Adaptermuster verwendet?

  • Wenn eine externe Komponente faszinierende Funktionen bietet, die wir gerne wiederverwenden möchten, die jedoch nicht mit unserer aktuellen Anwendung kompatibel sind . Ein geeigneter Adapter kann entwickelt werden, um sie miteinander kompatibel zu machen
  • Wenn unsere Anwendung nicht mit der von unserem Client erwarteten Schnittstelle kompatibel ist
  • Wenn wir alten Code in unserer Anwendung wiederverwenden möchten, ohne den ursprünglichen Code zu ändern

3. Fazit

In diesem Artikel haben wir uns das Adapter-Entwurfsmuster in Java angesehen.

Der vollständige Quellcode für dieses Beispiel ist auf GitHub verfügbar.