Návrhový vzor adapter (Wrapper) slouží pro definici jiného (stabilního) rozhraní, než daná třída poskytuje.
Příkladem z reálného života je adaptér do zásuvek. Pojedete-li do jiné země, tak tam velmi pravděpodobně narazíte na zásuvky, které mají jiný tvar a jiné napětí. Z tohoto důvodu je zapotřebí vložit mezi zařízení a zásuvku adaptér, který zajistí jak vhodné napětí, tak samotnou možnost zapojení (kvůli tvaru zásuvky).
Obdobně funguje návrhový adaptér. Máme nějakou třídu, jejíž rozhraní je z nějakého důvodu nevyhovující. Proto vytvoříme třídu adaptér, implementující požadované rozhraní, která bude dané volání překládat a volat adaptovanou třídu. Druhým častým důvodem použití adaptéru je nestabilita rozhraní adaptované třídy, například když tuto adaptovanou třídu (modul) vyvíjí jiná společnost. Potom je vhodné vytvořit adaptér, který se při změně rozhraní jednoduše upraví (v opačném případě by bylo nutné přepisovat všechna použití dané nestabilní třídy).
Příklad
Mějme v naší aplikaci z historických důvodů třídu, která počítá obsah obdélníku v imperiálních jednotkách. Protože soustava SI obsahuje metrické jednotky, tak chceme tuto třídu adaptovat tak, aby počítala obsah v metrických jednotkách. Použijeme vzor adapter.
Kód
01.
/**
02.
* Demostrace vzoru adapter
03.
* @author Pavel Micka
04.
*/
05.
public
class
AdapterDemonstration {
06.
public
static
void
main(String[] args){
07.
RequiredInterface metric =
new
MetricAreaMeter();
08.
System.out.println(metric.metricArea(
2
,
2
));
09.
}
10.
}
11.
/**
12.
* Pozadovane rozhrani
13.
* @author Pavel Micka
14.
*/
15.
interface
RequiredInterface{
16.
/**
17.
* Spocita velikost plochy obdelniku v metrickych jednotkach
18.
* @param lengthA velikost strany A v centimetrech
19.
* @param lengthB velikost strany B v centimetrech
20.
* @return plocha obdelniku v ctverecnich centimetrech
21.
*/
22.
public
double
metricArea(
double
lengthA,
double
lengthB);
23.
}
24.
/**
25.
* Adaptovane rozhrani
26.
* @author Pavel Micka
27.
*/
28.
interface
AdapteeInterface{
29.
/**
30.
* Spocita velikost plochy obdelniku v imperialnich jednotkach
31.
* @param lengthA velikost strany A v palcich
32.
* @param lengthB velikost strany B v palcich
33.
* @return plocha obdelniku v ctverecnich palcich
34.
*/
35.
public
double
imperalArea(
double
lengthA,
double
lengthB);
36.
}
37.
/**
38.
* Adapter
39.
* @author Pavel Micka
40.
*/
41.
class
MetricAreaMeter
implements
RequiredInterface{
42.
private
AdapteeInterface adaptee;
43.
public
MetricAreaMeter() {
44.
this
.adaptee =
new
ImperialAreaMeter();
45.
}
46.
47.
public
double
metricArea(
double
lengthA,
double
lengthB) {
48.
return
adaptee.imperalArea(lengthA /
2.54
, lengthB /
2.54
)*
2.54
*
2.54
;
49.
}
50.
}
51.
/**
52.
* Adaptovana trida
53.
* @author Pavel Micka
54.
*/
55.
class
ImperialAreaMeter
implements
AdapteeInterface{
56.
public
double
imperalArea(
double
lengthA,
double
lengthB) {
57.
return
lengthA*lengthB;
58.
}
59.
}