Adaptér - UML diagram
Adaptér - UML diagram

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

/**
 * Demostrace vzoru adapter
 * @author Pavel Micka
 */
public class AdapterDemonstration {
    public static void main(String[] args){
        RequiredInterface metric = new MetricAreaMeter();
        System.out.println(metric.metricArea(2, 2));
    }
}
/**
 * Pozadovane rozhrani
 * @author Pavel Micka
 */
interface RequiredInterface{
    /**
     * Spocita velikost plochy obdelniku v metrickych jednotkach
     * @param lengthA velikost strany A v centimetrech
     * @param lengthB velikost strany B v centimetrech
     * @return plocha obdelniku v ctverecnich centimetrech
     */
    public double metricArea(double lengthA, double lengthB);
}
/**
 * Adaptovane rozhrani
 * @author Pavel Micka
 */
interface AdapteeInterface{
    /**
     * Spocita velikost plochy obdelniku v imperialnich jednotkach
     * @param lengthA velikost strany A v palcich
     * @param lengthB velikost strany B v palcich
     * @return plocha obdelniku v ctverecnich palcich
     */
    public double imperalArea(double lengthA, double lengthB);
}
/**
 * Adapter
 * @author Pavel Micka
 */
class MetricAreaMeter implements RequiredInterface{
    private AdapteeInterface adaptee;
    public MetricAreaMeter() {
        this.adaptee = new ImperialAreaMeter();
    }

    public double metricArea(double lengthA, double lengthB) {
        return adaptee.imperalArea(lengthA / 2.54, lengthB / 2.54)*2.54*2.54;
    }
}
/**
 * Adaptovana trida
 * @author Pavel Micka
 */
class ImperialAreaMeter implements AdapteeInterface{
    public double imperalArea(double lengthA, double lengthB) {
        return lengthA*lengthB;
    }
}







Doporučujeme