Pasul 1 – Cuvinte cheie
Definirea cuvintelor cheie este rețeta secretă în această serie de ghiduri rapide. Această metodă m-a ajutat să înțeleg cu adevărat tiparele de proiectare, să le codific în mintea mea și să înțeleg diferențele dintre alte tipare de proiectare.
- Simplificare: Acesta este scopul acestui model de proiectare. Simplificarea unui sistem complicat.
- Restricție: Simplificarea vine adesea cu un „cost sacru”, restricția. Prin simplificarea codului, restricționăm clienții de la accesul neautorizat. Prin urmare, îi împiedică să facă greșeli care ar fi greu de perceput într-un subsistem complicat.
Există un compromis între simplificare și restricție. Simplificarea excesivă a unui sistem înseamnă că dezvoltatorul este prea restricționat, prin urmare mai puțină libertate decât este necesar, ceea ce nu este întotdeauna un lucru bun. Sub-simplificarea modelului Facade înseamnă că există prea multă libertate, ceea ce face ca modelul Facade să fie irelevant. Găsirea echilibrului fin este ceea ce face ca un model Facade să fie bun, util și eficient.
Pasul 2 – Diagrama
Diagrama se bazează, de asemenea, pe exemplul dat. Pentru a simplifica această diagramă, o putem separa în trei părți:
- Client: Clientul din acest exemplu este clientul unui restaurant care dorește să comande mâncare.
- Fațadă: Sarcina sa este de a putea oferi clientului un acces mai simplificat către numeroase subsisteme interdependente care sunt considerate complicate. În acest exemplu, comanda de mâncare a unui client ar necesita o serie de apeluri de metode atent secvențiate a două subsisteme diferite (Ospătar și Bucătărie).
- Subsisteme: Subsistemele sunt ascunse de client. Ele ar putea, de asemenea, să nu fie accesibile clientului. Clientul nu se poate juca cu niciunul dintre subsisteme, unde o simplă modificare de cod se poate dovedi fatală sau chiar poate strica alte părți necunoscute ale sistemului însuși. În acest scenariu, ospătarul și bucătăria trebuie să îndeplinească o serie de sarcini. Sarcina unui subsistem este uneori dependentă de sarcina altuia. De exemplu, bucătăria nu poate pregăti mâncarea dacă ospătarul nu aduce comanda la bucătărie. Ospătarul nu poate servi clientul dacă mâncarea nu este gătită.
Pasul 3 – Codarea prin exemplu
Vă sugerez să copiați codul clasă cu clasă din depozitul meu git „Andreas Poyias” sau din fragmentele de mai jos (în ordinea furnizată) și să le lipiți în oricare dintre editorii C++ disponibili online, cum ar fi c++shell, jdoodle , onlineGDB și să le rulați pentru a observa rezultatul. Apoi citiți comentariile sau descrierea de mai jos. Nu vă grăbiți, citind-o cu atenție (asta înseamnă un minut, nici mai puțin și nici mai mult).
Subsisteme
În acest exemplu, cele două subsisteme sunt Waiter_Subsystem1
și Kitchen_Subsystem2
. La o primă vedere, fiecare subsistem pare a fi independent, deoarece poate îndeplini anumite sarcini în mod individual. Dar este adevărat acest lucru?
#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: În acest exemplu, clasa Facade se referă la comenzi de mâncare în restaurant. Pentru a executa cu succes o comandă de mâncare, ne bazăm pe o anumită secvență de apeluri de metode, iar un apel este dependent de cel anterior și așa mai departe. Bucătăria nu poate pregăti mâncarea dacă ospătarul nu scrie comanda și nu o trimite la bucătărie. Clasa Facade oferă sarcinaorderFood
clientului pentru a o simplifica și pentru a evita orice utilizare greșită din cauza complexității care există.
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();
}
};
Funcția principală
Funcția principală operează ca și clientul(la fel ca în ghidurile anterioare). Este atât de ușor pentru client să poată crea o instanță Facade și să apeleze o funcție pentru a-și face treaba.
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
Există câteva beneficii pentru utilizarea modelului Facade și câteva puncte care trebuie reținute atunci când se abordează Facade.
- Facade definește o interfață de nivel superior care face subsistemul mai ușor de utilizat prin învelirea unui subsistem complicat.
- Aceasta reduce curba de învățare necesară pentru a valorifica cu succes subsistemul.
- De asemenea, promovează decuplarea subsistemului de potențialii săi numeroși clienți.
- Pe de altă parte, dacă Facade este singurul punct de acces pentru subsistem, aceasta va limita caracteristicile și flexibilitatea de care ar putea avea nevoie „utilizatorii avansați”.
Următorul blog va fi un ghid rapid pentru modelul de proiectare Observer. Este un tipar comportamental care este o necesitate pentru depozitul dumneavoastră de cunoștințe. Nu uitați să dați like/clap la blog-postul meu și să îmi urmăriți contul. Asta pentru a-mi da satisfacția că am ajutat niște colegi dezvoltatori și pentru a mă împinge să continui să scriu. Dacă există un anumit model de proiectare despre care ați dori să învățați, atunci anunțați-mă, astfel încât să vi-l pot oferi în viitor.
Alte ghiduri rapide privind modelele de proiectare:
- Modele de proiectare – Un ghid rapid pentru Fabrica abstractă.
- Modele de proiectare – Un ghid rapid pentru modelul Bridge.
- Design Patterns – Un ghid rapid pentru Builder Pattern.
- Design Patterns – Un ghid rapid pentru Decorator Pattern.
- Design Patterns – Un ghid rapid pentru Facade Pattern.
- Design Patterns – Un ghid rapid pentru Observer Pattern.
- Design Patterns – Un ghid rapid pentru Singleton Pattern.
.