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.
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.
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();