Adaptermønsteret i Java

1. Oversigt

I denne hurtige vejledning skal vi se på adaptermønsteret og dets Java-implementering.

2. Adaptermønster

Et adaptermønster fungerer som et stik mellem to inkompatible grænseflader, som ellers ikke kan forbindes direkte. En adapter indpakker en eksisterende klasse med en ny grænseflade, så den bliver kompatibel med klientens grænseflade.

Hovedmotivet bag brugen af ​​dette mønster er at konvertere en eksisterende grænseflade til en anden grænseflade, som klienten forventer. Det implementeres normalt, når applikationen er designet.

2.1. Adaptermønstereksempel

Overvej et scenario, hvor der er en app, der er udviklet i USA, som returnerer tophastigheden af ​​luksusbiler i miles i timen (MPH). Nu skal vi bruge den samme app til vores klient i Storbritannien, der ønsker de samme resultater, men i kilometer i timen (km / t).

For at håndtere dette problem opretter vi en adapter, der konverterer værdierne og giver os de ønskede resultater:

Først opretter vi den originale grænseflade Bevægelig som formodes at returnere hastigheden på nogle luksusbiler i miles i timen:

offentlig grænseflade Movable {// returnerer hastighed i MPH dobbelt getSpeed ​​(); }

Vi opretter nu en konkret implementering af denne grænseflade:

offentlig klasse BugattiVeyron implementerer flytbar {@ Override offentlig dobbelt getSpeed ​​() {return 268; }}

Nu opretter vi en adaptergrænseflade Flytbar adapter der vil være baseret på det samme Bevægelig klasse. Det kan ændres let for at give forskellige resultater i forskellige scenarier:

offentlig grænseflade MovableAdapter {// returnerer hastighed i KM / H dobbelt getSpeed ​​(); } 

Implementeringen af ​​denne grænseflade vil bestå af en privat metode konverterMPHtoKMPH () der vil blive brugt til konvertering:

offentlig klasse MovableAdapterImpl implementerer MovableAdapter {private Movable luxuryCars; // standardkonstruktører @ Override offentlig dobbelt getSpeed ​​() {return convertMPHtoKMPH (luxuryCars.getSpeed ​​()); } privat dobbeltkonverterMPHtoKMPH (dobbelt mph) {return mph * 1.60934; }}

Nu bruger vi kun de metoder, der er defineret i vores adapter, og vi får de konverterede hastigheder. I dette tilfælde gælder følgende påstand:

@Test offentlig ugyldig nårConvertingMPHToKMPH_thenSuccessfullyConverted () {Movable bugattiVeyron = new BugattiVeyron (); MovableAdapter bugattiVeyronAdapter = ny MovableAdapterImpl (bugattiVeyron); assertEquals (bugattiVeyronAdapter.getSpeed ​​(), 431.30312, 0.00001); }

Som vi kan bemærke her, konverteres vores adapter 268 mph til 431 km / t i denne særlige sag.

2.2. Hvornår skal man bruge adaptermønster

  • Når en ekstern komponent giver fængslende funktionalitet, som vi gerne vil genbruge, men den er uforenelig med vores nuværende applikation. En passende adapter kan udvikles for at gøre dem kompatible med hinanden
  • Når vores applikation ikke er kompatibel med den grænseflade, som vores klient forventer
  • Når vi ønsker at genbruge ældre kode i vores applikation uden at foretage nogen ændringer i den oprindelige kode

3. Konklusion

I denne artikel har vi kigget på adapterdesignmønsteret i Java.

Den fulde kildekode til dette eksempel er tilgængelig på GitHub.