Design Patterns – A Facade minta gyors útmutatója.

1. lépés – Kulcsszavak

A kulcsszavak meghatározása a titkos recept ebben a gyors útmutató sorozatban. Ez a módszer segített igazán megérteni a tervezési mintákat, rögzíteni őket a fejemben, és megérteni a különbségeket más tervezési minták között.

  1. Egyszerűsítés: Ez a célja ennek a tervezési mintának. Egy bonyolult rendszer egyszerűsítése.
  2. Korlátozás: Az egyszerűsítésnek gyakran van egy “szent ára”, a korlátozás. A kód egyszerűsítésével korlátozzuk az ügyfeleket a jogosulatlan hozzáféréstől. Ezért megakadályozzuk őket abban, hogy olyan hibákat kövessenek el, amelyeket egy bonyolult alrendszerben nehéz lenne észrevenni.

Az egyszerűsítés és a korlátozás között kompromisszumot kell kötni. Egy rendszer túlzott leegyszerűsítése azt jelenti, hogy a fejlesztőt túlságosan korlátozzák, ezért a szükségesnél kevesebb szabadságot kap, ami nem mindig jó dolog. A Facade minta alul-egyszerűsítése azt jelenti, hogy túl nagy a szabadság, ami a Facade mintát irrelevánssá teszi. A finom egyensúly megtalálása teszi a jó, hasznos és hatékony Facade mintát.

2. lépés – Diagram

A diagram is a megadott példán alapul. A diagram egyszerűsítése érdekében három részre bonthatjuk.

  1. Ügyfél: A kliens ebben a példában egy étterem ügyfele, aki ételt szeretne rendelni.
  2. Homlokzat: Feladata, hogy a kliens számára minél egyszerűbb hozzáférést tudjon biztosítani a bonyolultnak tekinthető számos, egymástól függő alrendszer felé. Ebben a példában az ügyfél ételrendelése két különböző alrendszer (Pincér és Konyha) gondosan egymásra épülő metódushívásainak sorozatát igényelné.
  3. Alrendszerek: Az alrendszerek el vannak rejtve az ügyfél elől. Az is lehet, hogy az ügyfél számára nem elérhetőek. Az ügyfél nem tud babrálni az alrendszerek egyikével sem, ahol egy egyszerű kódváltoztatás végzetesnek bizonyulhat, vagy akár magát a rendszer más, ismeretlen részeit is tönkreteheti. Ebben a forgatókönyvben a pincérnek és a konyhának egy sor feladatot kell elvégeznie. Egy alrendszer feladata néha függ egy másik alrendszer feladatától. Például a konyha nem tudja elkészíteni az ételt, ha a pincér nem hozza el a rendelést a konyhába. A pincér nem tudja kiszolgálni az ügyfelet, ha az étel nincs megfőzve.

3. lépés – Kódolás példával

Azt javaslom, hogy másolja ki a kódot osztályról osztályra a git tárolómból “Andreas Poyias” vagy az alábbi részleteket (a megadott sorrendben), és illessze be bármelyik elérhető online C++ szerkesztőbe, mint a c++shell, jdoodle , onlineGDB és futtassa a kimenet megfigyeléséhez. Ezután olvassa el az alábbi megjegyzéseket vagy leírást. Szánjon rá időt, olvassa el alaposan (ez egy percet jelent, nem kevesebbet és nem többet).

Alrendszerek

Ebben a példában a két alrendszer a Waiter_Subsystem1és aKitchen_Subsystem2. Első pillantásra úgy tűnik, hogy az egyes alrendszerek függetlenek, mivel bizonyos feladatokat külön-külön is el tudnak végezni. De vajon igaz-e ez?

#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";}
};

Facade: Ebben a példában a Facade osztály az éttermi ételrendelésekről szól. Egy ételrendelés sikeres végrehajtásához a metódushívások egy meghatározott sorozatára támaszkodunk, és az egyik hívás függ az előzőtől és így tovább. A konyha, nem tudja elkészíteni az ételt, ha a pincér nem írja meg a rendelést és nem küldi el a konyhába. A Facade osztály biztosítja aorderFood feladatot az ügyfél számára, hogy egyszerűsítse azt, és elkerülje az esetleges visszaéléseket a meglévő komplexitás miatt.

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

Főfüggvény
A főfüggvény úgy működik, mint az ügyfél(ugyanaz, mint az előző útmutatók). A kliens számára olyan egyszerű, hogy képes létrehozni egy Facade példányt és meghívni egy függvényt, hogy elvégezze a feladatát.

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

A Facade minta használatának van néhány előnye és néhány pont, amire figyelni kell, amikor a Facade-ot kell megközelíteni.

  • A Facade egy magasabb szintű interfészt definiál, amely egy bonyolult alrendszer becsomagolásával megkönnyíti az alrendszer használatát.
  • Ez csökkenti az alrendszer sikeres kihasználásához szükséges tanulási görbét.
  • Ez elősegíti az alrendszer függetlenítését a potenciálisan sok ügyféltől.
  • Másrészt, ha a Facade az alrendszer egyetlen hozzáférési pontja, az korlátozza azokat a funkciókat és rugalmasságot, amelyekre a “power usereknek” szüksége lehet.

A következő blogban az Observer tervezési mintát mutatjuk be. Ez egy olyan viselkedési minta, amely elengedhetetlen a tudástáradhoz. Ne felejtsd el kedvelni/tapsolni a blogbejegyzésemet, és kövesd a fiókomat. Ez azt az elégedettséget adja nekem, hogy segítettem néhány fejlesztőtársamnak, és arra ösztönöz, hogy folytassam az írást. Ha van egy konkrét tervezési minta, amiről szeretnél tanulni, akkor tudasd velem, hogy a jövőben tudjam biztosítani neked.

Más gyors útmutatók a tervezési mintákról:

  1. Design Patterns – A quick guide to Abstract Factory.
  2. Design Patterns – A quick guide to Bridge Pattern.
  3. Design Patterns – A quick guide to Builder Pattern.
  4. Design Patterns – A quick guide to Decorator Pattern.
  5. Design Patterns – A quick guide to Facade Pattern.
  6. Design Patterns – A quick guide to Observer Pattern.
  7. Design Patterns – A quick guide to Singleton Pattern.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.