Adapter


Tato část je o návrhovém vzoru Adapter. Tento návrhový vzor můžeme použít k adaptování nějakého existujícího rozhraní třídy na jiné.

Proč Adapter použít

Pokud potřebujeme z nějakého důvodu předělat rozhraní nějaké třídy, kterou již někde v našem kódu používáme, tak ji nemusíme přepisovat. Můžeme si pro ni vytvořit Adapter, ve kterém si pro ni vytvoříme nové rozhraní.

Příklad - Vytvoření nového rozhraní

Následující ukázka ukazuje třídu Kalkulacka, která obsahuje jednu metodu pro provedení početní operace mezi dvěma čísly. Tato metoda bere 3 parametry. První dva představují čísla se kterými se má pracovat a třetí určuje operaci, která se má provést.

const Operace = Object.freeze({
    scitani: 0,
    odcitani: 1,
    nasobeni: 2,
    deleni: 3
});

class Kalkulacka {
    spocitej(cislo1, cislo2, operace) {
        switch (operace) {
            case Operace.scitani:
                return cislo1 + cislo2;
            case Operace.odcitani:
                return cislo1 - cislo2;
            case Operace.nasobeni:
                return cislo1 * cislo2;
            case Operace.deleni:
                return cislo1 / cislo2;
        }
    }
}


const kalkulacka = new Kalkulacka();
const vysledek = kalkulacka.spocitej(5, 2, Operace.odcitani);
console.log(vysledek);

Teď si představme že chceme třídu Kalkulacka z minulé části refaktorizovat. Namísto jedné metody pro ni vytvoříme metody pro jednotlivé početní operace. Následující ukázka předělanou třídu Kalkulacka ukazuje.

class Kalkulacka {
    secti(cislo1, cislo2) {
        return cislo1 + cislo2;
    }

    odecti(cislo1, cislo2) {
        return cislo1 - cislo2;
    }

    vynasob(cislo1, cislo2) {
        return cislo1 * cislo2;
    }

    vydel(cislo1, cislo2) {
        return cislo1 - cislo2;
    }
}


const kalkulacka = new Kalkulacka();

// - třída Kalkulacka již metodu spocitej neobsahuje
// const vysledek = kalkulacka.spocitej(5, 2, Operace.odcitani);

Po refaktorizaci třídy Kalkulacka již nemáme k dispozici metodu spocitej. Pokud ji tedy v našem kódu někde používáme, náše aplikace přestane fungovat. To můžeme vyřešit tak, že kód který jsme dříve napsali přepíšeme, nebo pro něj vytvoříme Adapter. Následující ukázka ukazuje, jak můžeme pro třídu Kalkulacka vytvořit Adapter.

const Operace = Object.freeze({
    scitani: 0,
    odcitani: 1,
    nasobeni: 2,
    deleni: 3
});

class Kalkulacka {
    secti(cislo1, cislo2) {
        return cislo1 + cislo2;
    }

    odecti(cislo1, cislo2) {
        return cislo1 - cislo2;
    }

    vynasob(cislo1, cislo2) {
        return cislo1 * cislo2;
    }

    vydel(cislo1, cislo2) {
        return cislo1 - cislo2;
    }
}

// Adapter pro třídu Kalkulacka
class KalkulackaAdapter {
    constructor() {
        this.kalkulacka = new Kalkulacka();
    }

    // rozhraní, které můžeme použít namísto rozhraní, které má třída Kalkulacka
    spocitej(cislo1, cislo2, operace) {
        switch (operace) {
            case Operace.scitani:
                return this.kalkulacka.secti(cislo1, cislo2);
            case Operace.odcitani:
                return this.kalkulacka.odecti(cislo1, cislo2);
            case Operace.nasobeni:
                return this.kalkulacka.vynasob(cislo1, cislo2);
            case Operace.deleni:
                return this.kalkulacka.vydel(cislo1, cislo2);
        }
    }
}


const kalkulacka = new KalkulackaAdapter();
// díky Adapteru můžeme používat jiné rozhraní než má třída Kalkulacka
const vysledek = kalkulacka.spocitej(5, 2, Operace.odcitani);
console.log(vysledek);