Wzorce projektowe: Fasada(Facade)

W tym artykule o wzorcu projektowym Fasada, którego głównym zadaniem jest udostępnienie złożonego systemu klientowi w postaci uproszczonego, uporządkowanego interfejsu programistycznego.

 

Opis i implementacja

Fasadę implementujemy w postaci jednej klasy, która jest powiązana z innymi klasami złożonego systemu ma za zadanie wywoływać metody powiązanych z nią klas. Często można spotkać fasadę w dużych systemach, w korporacjach, czyli tam gdzie potrzeba prostego sposobu na dostęp do różnych danych.

A Fasada ułatwia dostęp do różnych obiektów i ukrywa szczegóły implementacji, i dobrze bo klienta nie obchodzi jak dokładnie jest zaimplementowany system, on tylko chce mieć dostęp do danych, które go interesują.

Przykładem implementacji może być np system bankowy, w którym mamy tylko dostęp do niektórych funkcji systemu, przelewy, saldo konta itp.

 

Struktura

Dobrze opisuje Fasadę poniższy diagram:

Facade scheme

Znaczy on tyle, że fasada udostępnia jedną klasę do używania masy oprogramowania.

Spójrzmy też na inny diagram poniżej:

Facade scheme

Widzimy, że mamy przeróżne klasy i o wszystkich wie klasa fasady, więc udostępnia ona w klasie uproszczony interfejs do używania tych wszystkich klas, klient nie musi znać dokładnych szczegółów implementacji.

Przykłady

Fasada banku

Zobaczmy teraz jak wygląda fasada w praktycznym przykładzie z życia wziętego.

Mamy za zadanie np stworzyć symulator konta bankowego, czyli musimy stworzyć API udostępniane klientowi:

O wiele łatwiejsze jest korzystanie z API niż odwoływać się do poszczególnych części systemu, także system jest o wiele bezpieczniejszy, ponieważ klient nie ma dostępu do całego systemu.

Jeszcze żeby weszły w krew zasady solid i dependency injection użyjmy kontenera z lekcji o dependency injection żeby zarejestrować instancje klas w konstruktorze a nie tak tworzyć je na sztywno

Teraz jest to bardziej zgodne z solid i dependency injection i ogólnie z zasadami czystości kodu.

Wynik:

 

Fasada tworzenia samochodu

W tym przykładzie zrobimy sobie przykład tworzenia samochodu, będzie ten przykład bardzo podobny do poprzedniego, zacznijmy od klas tworzących poszczególne części samochodu.

Sporo tych klas a klienta nie interesuje dokładna ich implementacja, dlatego mamy klasę fasady, która upraszcza korzystanie z tych klas.

Korzystając z dependency Injection, wstrzykujemy zależności w kostruktorze i tylko za pomocą jednej metody CreateCompleteCar() tworzymy samochód, dzięki temu klient nie musi zagłębiać się w szczegóły implementacji i pewnie będzie nam wdzieczny za naszą klasę fasady.

Wywołanie w kliencie wygląda tak:

Wynik:

 

Zalety i wady

Zalety

  • Zmniejszenie liczby zależności między klientem i systemem, całość jest łatwiejsza w utrzymaniu i konserwacji, jeśli klient nie korzysta z poszczególnych części systemu.
  • Podział aplikacji na warstwy, oddzielne rozwijanie klienta i systemu.
  • Możliwość zablokowania klientowi dostępu do niektórych funkcjonalności systemu.

Wady

  • Chyba nie ma żadnych…

 

Powiązania z innymi wzorcami

  • Fasada tworzy nowy interfejs upraszczający używanie istniejących funkcjonalności, adapter tworzy interfejs współpracujący ze starym interfejsem.
  • Pyłek pokazuje jak zrobić dużo małych obiektów, Fasada pokazuje jak zrobić jeden obiekt reprezentujący cały system.
  • Mediator jest podobny do fasady pod tym względem, że uproszczają istniejącą funkcjonalność, ale różnią się tym, że Mediator jedynie upraszcza komunikację między klasami a Fasada tworzy interfejs, dzięki któremu będzie po prostu łatwiej korzystać z istniejących funkcjonalności.
  • Obiekty Fasady są często singletonami, ponieważ w fasadzie tylko jeden obiekt jest potrzebny.

 

Podsumowanie

I to wszystko na temat wzorca Fasada🙂

Jak widać wzorzec Fasady jest bardzo przydatny, teraz np będziemy mogli wybrać, które części systemu udostępnić np naszemu koledze w zespole, żeby nie musiał wiedzieć, co dokładnie jak działa, tylko żeby od razu mógł go używać.

Link do githuba ze wszystkimi przykładami:  https://github.com/Slaw145/FasadaTutorial

W następnym artykule, będzie mowa o wzorcu Kompozyt(Composite).

Standardowo, przypominam o newsletterze, którym wysyłam powiadomienia o nowych wpisach oraz dodatkowe informacje na temat, ogółem mówiąc, świecie IT.

KONIECZNIE dołącz do społeczności DevmanCommunity na fb, części społeczności jest w jednym miejscu 🙂

-strona na fb: Devman.pl-Sławomir Kowalski

-grupa na fb: DevmanCommunity

Pytaj, komentuj pod spodem na końcu wpisu, podziel się nim, oceń go, rób co wolisz🙂

 
Jeśli ten wpis ci się przydał podziel się nim ze swoimi znajomymi :)

Post a comment

2 Comments to "Wzorce projektowe: Fasada(Facade)"

avatar
  Subscribe  
newest oldest evaluated
Notify about
Rolek
Guest

Sorki, ale te dwa zapisy które wymieniłem poniżej nie bardzo różnią sie od siebie. Za tworzenie poszczególnych obiektów nadal jest odpowiedzialna klasa ClientApi.