Facade


Tato část je o návrhovém vzoru Facade (také psaného jako Façade). Tento návrhový vzor poskytuje jednoduché a snadno pochopitelné rozhraní přes velký a sofistikovaný blok kódu.

Proč Facade použít

Návrhový vzor Facade si můžeme představit například na nějakém domu. Typický dům obsahuje různé systémy, například elektřinu a kanalizaci. Člověka, jako obyvatele domu vůbec nemusí zajímat jak elektřina nebo kanalizace funguje, jen tyto systémy používá. Pokud chce například rožnout světlo, tak jen stiskne přepínač a nezajímá ho jak elektřina funguje. Facade nám tedy poskytuje jednodušší a snadno pochopitelné rozhraní přes nějaký komplexnější systém.

Facade můžeme použít k vytvoření snadno použitelného rozhraní přes nějaký komplexní systém, který jsme vytvořili. Díky tomu tak například můžeme někomu jinému umožnit s naším systém jednoduše pracovat.

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

Následující ukázka ukazuje systém představující restauraci, ve které se dá zakoupit jídlo (v našem případě jen salát). Ukázka obsahuje třídu Restaurace, která představuje Facade a pomocí jejich metod můžeme restauraci jednoduše používat, aniž bychom věděli co se děje v zákulisí.

// Tomuto kód nemusíte rozumět (stejně není logický, je tu jen pro ukázku)
class Lednice {
    constructor(veci=[]) {
        this.veci = veci;
    }
    pridej(vec) {
        this.veci.push(vec);
    }
    ziskej(vec) {
        let idx = this.veci.findIndex(v => v === vec);
        if (idx === -1) return undefined;
        const ziskanaVec = this.veci.splice(idx, 1)[0];
        return ziskanaVec;
    }
}
class Kuchyne {
    constructor() {
        this.lednice = new Lednice(["tatarka, mléko, kečup, rajčata", "paprika", "mrkev"]);
        this.pripravenaJidla = [];
    }
    pripravSalat() {
        this.lednice.ziskej("rajčata");
        this.lednice.ziskej("paprika");
        this.lednice.ziskej("mrkev");
        this.pripravenaJidla.push("salat");
    }
    ziskejJidlo(jidlo) {
        let idx = this.pripravenaJidla.findIndex(j => j === jidlo);
        if (idx === -1) return undefined;
        const ziskaneJidlo = this.pripravenaJidla.splice(idx, 1)[0];
        return ziskaneJidlo;
    }
}
// tato třída představuje Facade, která poskytuje snadno
// použitelné rozhraní přes komplikovanější systém
class Restaurace {
    constructor() {
        this.kuchyne = new Kuchyne();
    }

    // díky této metodě (popřípadě i dalším, pokud by jich bylo více) můžeme třídu
    // Restaurace pohodlně používat, aniž bychom věděli co se děje v zákulisí
    ziskejSalat() {
        this.kuchyne.pripravSalat();
        return this.kuchyne.ziskejJidlo("salat");
    }
}


const restaurace = new Restaurace();
let salat = restaurace.ziskejSalat();