We wakacje wybieramy się do jakiegoś obcego kraju i niekiedy nieprzyjemna niespodzianka, w danym kraju są inne standardy wtyczek sieciowych (Wielka Brytania) oraz np. napięcia sieciowego (USA, Kanada). Wtedy okazuje się ze trzeba zabrać konwerter napięcia, albo przejściówkę która pozwoli na podłączenie wtyczki polskiej do angielskiego gniazdka obie te rzeczy pełnią rolę adaptera.

Tak samo w programowaniu niekiedy zachodzi konieczność, konwersji jednego rodzaju danych do innego formatu, jednego interfejsu do formatu innego interfejsu. Do takiego celu służy wzorzec adapter (Wrapper).

W praktyce możemy się spotkać z:

  • Adapterami klas – klasa wykorzystuje wielokrotne dziedziczenie, gdzie klasa adaptera dziedziczy prywatnie po klasie adaptowanej oraz publicznie implementuje interfejs klienta
  • Adapterami obiektu – klasa adaptera dziedziczy interfejs klienta oraz zawiera w sobie klasę adaptowaną. Zamiast dziedziczenia jest wykorzystywana kompozycja, umożliwia to oddzielenie klasy klienta od klasy adaptowanej
  • Adapterem dwukierunkowym – klasa implementuje i konwertuje interfejs klienta oraz interfejsu obiektu adaptowanego
  • Adapterami danych – dobrym przykładem jest mechanizm autoboxa w javie, który automatycznie konwertuje typy proste do typów klasowych. Int to Int, boolean to Boolean, itd. w drugą stronę

Adaptera stosuje się najczęściej w przypadku, gdy występuje niekompatybilność interfejsu, co nie pozwala na wykorzystanie istniejącej klasy. Innym powodem zastosowania adaptera jest chęć stworzenia klasy, która będzie współpracowała z klasami o nie wiadomych interfejsach.

Przykład:

Mamy klienta który musi wywołać metodę zapisującej dane, która jednak musi zapisać dane w „nowym formacie”, jednocześnie nie zmieniając struktury programu, tak z życia wzięte…

interface Writer{
	public void save(String data);
}
 
class NewWriter{
	public void save(String data, int color){
 
		System.out.println("Save data: " + data + " color: " + color);
	}
}
 
class DataWriter implements Writer{
 
	@Override
	public void save(String data){
 
		NewWriter adapter = new NewWriter();
		adapter.save(data, 0);
	}
}
 
public class DesignPatternsAdapter{
 
	public static void main(String[] args){
 
		Writer writer = new DataWriter();
		writer.save("Super value");
	}
}