Krok 1 – Klíčová slova
Definice klíčových slov je tajným receptem v této sérii stručných průvodců. Tato metoda mi pomohla skutečně pochopit návrhové vzory, natvrdo si je uložit do paměti a pochopit rozdíly mezi ostatními návrhovými vzory.
- Zjednodušení: To je cílem tohoto návrhového vzoru. Zjednodušit složitý systém.
- Omezení: Zjednodušení s sebou často nese „posvátnou cenu“, omezení. Zjednodušením kódu omezujeme klienty před neoprávněným přístupem. Zabraňuje jim tedy dělat chyby, které by ve složitém subsystému těžko postřehli.
Mezi zjednodušením a omezením existuje kompromis. Přílišné zjednodušení systému znamená, že vývojář je příliš omezen, tedy méně volnosti, než je nutné, což není vždy dobré. Nedostatečné zjednodušení vzoru Facade znamená příliš velkou volnost, což činí vzor Facade irelevantním. Nalezení jemné rovnováhy je to, co dělá vzor Facade dobrým, užitečným a efektivním.
Krok 2 – diagram
Diagram vychází také z uvedeného příkladu. Pro zjednodušení můžeme tento diagram rozdělit na tři části:
- Klient: Klientem je v tomto příkladu zákazník restaurace, který si chce objednat jídlo.
- Fasáda: Jejím úkolem je umět klientovi poskytnout jednodušší přístup k četným vzájemně závislým subsystémům, které jsou považovány za komplikované. V tomto příkladu by klientova objednávka jídla vyžadovala sérii pečlivě řazených volání metod dvou různých subsystémů (číšník a kuchyně).
- Subsystémy: Subsystémy jsou před klientem skryty. Mohou být také klientovi nepřístupné. Klient si nemůže pohrávat s žádným z podsystémů, kde se jednoduchá změna kódu může ukázat jako fatální nebo dokonce rozbít další neznámé části samotného systému. V tomto scénáři musí obsluha a kuchyně provést řadu úkolů. Úkol subsystému je někdy závislý na jiném úkolu. Například kuchyně nemůže připravit jídlo, pokud číšník nepřinese objednávku do kuchyně. Číšník nemůže obsloužit zákazníka, pokud není jídlo připraveno.
Krok 3 – Kód podle příkladu
Navrhuji zkopírovat kód třídu po třídě z mého git repozitáře „Andreas Poyias“ nebo níže uvedené úryvky (v uvedeném pořadí) a vložit je do některého z dostupných online editorů C++, jako je c++shell, jdoodle , onlineGDB, a spustit je a pozorovat výstup. Poté si přečtěte komentáře nebo popis níže. Dejte si na čas a přečtěte si ho důkladně (to znamená minutu, ne méně a ne více).
Podsystémy
V tomto příkladu jsou dva podsystémy Waiter_Subsystem1
aKitchen_Subsystem2
. Na první pohled se zdá, že každý subsystém je nezávislý, protože může provádět určité úkoly samostatně. Je to však pravda?
#include <iostream>
using namespace std;class Waiter_Subsystem1
{
public:
void writeOrder() { cout << " Waiter writes client's order\n";}
void sendToKitchen(){ cout << " Send order to kitchen\n";}
void serveCustomer(){ cout << " Yeeei customer is served!!!\n";}
};class Kitchen_Subsystem2
{
public:
void prepareFood(){ cout << " Cook food\n";}
void callWaiter() { cout << " Call Waiter\n";}
void washDishes() { cout << " Wash the dishes\n";}
};
Faktura: V tomto příkladu se třída Facade zabývá objednávkami jídla v restauraci. Abychom úspěšně provedli objednávku jídla, spoléháme na určitou posloupnost volání metod a jedno volání je závislé na předchozím a tak dále. Kuchyně, nemůže připravit jídlo, pokud číšník nenapíše objednávku a nepošle ji do kuchyně. Třída Facade poskytujeorderFood
klientovi úlohu, aby ji zjednodušila a zabránila jakémukoli zneužití kvůli existující složitosti.
class Order_Facade
{
private:
Waiter_Subsystem1waiter;
Kitchen_Subsystem2 kitchen;
public:
void orderFood()
{
cout << "A series of interdependent calls on various subsystems:\n";
waiter.writeOrder();
waiter.sendToKitchen();
kitchen.prepareFood();
kitchen.callWaiter();
waiter.serveCustomer();
kitchen.washDishes();
}
};
Hlavní funkce
Hlavní funkce pracuje jako klient(stejně jako předchozí průvodci). Je tak snadné, aby klient mohl vytvořit instanci Facade a zavolat funkci, která bude vykonávat jeho práci.
int main(int argc, char *argv)
{
// Simple for the client
// no need to know the order or the
// dependencies among various subsystems.
Order_Facade facade;
facade.orderFood();return 0;
}// Output
// A series of interdependent calls on various subsystems:
// Waiter writes client's order
// Send order to kitchen
// Cook food
// Call Waiter
// Yeeei customer is served!!!
// Wash the dishes
Existuje několik výhod pro použití vzoru Facade a několik bodů, které je třeba si uvědomit, když se má k Facade přistupovat.
- Facade definuje rozhraní vyšší úrovně, které usnadňuje používání subsystému tím, že obaluje složitý subsystém.
- Snižuje to křivku učení nutnou k úspěšnému využití subsystému.
- Podporuje to také oddělení subsystému od jeho potenciálně mnoha klientů.
- Na druhou stranu, pokud je Facade jediným přístupovým bodem k subsystému, omezí to funkce a flexibilitu, které mohou „zkušení uživatelé“ potřebovat.
Příští blog bude stručným průvodcem návrhovým vzorem Observer. Jedná se o vzor chování, který nesmí chybět ve vaší zásobárně znalostí. Nezapomeňte lajkovat/tleskat můj blog-příspěvek a sledovat můj účet. To mi poskytne uspokojení, že jsem pomohl některým kolegům vývojářům, a postrčí mě to k dalšímu psaní. Pokud se chcete dozvědět o nějakém konkrétním návrhovém vzoru, dejte mi vědět, abych vám ho mohl v budoucnu poskytnout.
Další rychlé průvodce návrhovými vzory:
- Návrhové vzory – Rychlý průvodce abstraktní továrnou.
- Návrhové vzory – Rychlý průvodce vzorem mostu.
- Design Patterns – A quick guide to Builder Pattern.
- Design Patterns – A quick guide to Decorator Pattern.
- Design Patterns – A quick guide to Facade Pattern.
- Design Patterns – A quick guide to Observer Pattern.
- Design Patterns – A quick guide to Singleton Pattern.