Wzorce projektowe – Fasada

 maj, 07 - 2017   PHPWzorce Projektowe

Wzorce Projektowe - FasadaFasada jest jednym z prostszych w zrozumieniu i zastosowaniu wzorców projektowych. Wykorzystanie tego wzorzec jest tak oczywiste i naturalny, że chyba nie ma programisty, który by z niego nie skorzystał. Ideą jest stworzenie uproszczonego interfejsu, które wywołują bardziej złożone części aplikacji. Artykuł ten opisuje wzorzec fasady na bazie prostego przykładu w języku PHP.

 

 

Charakterystyka wzorca fasada

 

Fasada (facade) jest to strukturalny wzorzec projektowy, którego zadaniem jest dostarczenie ujednoliconego, uproszczonego i uporządkowanego interfejsu programistycznego do złożonego systemu. Innymi słowy wzorzec fasada agreguje elementy złożonego systemu, tworząc większą całość oraz udostępniając łatwy w użyciu interfejs. Implementacja zazwyczaj polega na utworzeniu klasy będącej pośrednikiem pomiędzy klientem a systemem.

Poniższy diagram UML pokazuje ogólną strukturę wzorca. Jak widać klasa fasady agreguje poszczególne części systemu w jedną spójną całość i udostępnia interfejs do wykonywania operacji systemu.

 

fasada - diagram klas UML - wzorzec projektowy

 

 

Przykład zastosowania wzorca fasada – prosty system bankowy

 

Poniższy przykład zastosowania wzorca fasady przedstawia bardzo prosty system konta bankowego. Działanie systemu będzie polegało na realizacji dwóch podstawowych funkcjonalności: pobierania i wpłacania pieniędzy na konto. Napiszmy prosty skrypt realizujący te operacje:

Jak widzimy skrypt w pierwszej kolejności tworzy obiekt konta bankowego (tzn. jego fasady), a następnie wywoływane są metody pobierania i wpłacania określonych kwot.

Z punktu widzenia programisty, korzystanie z systemu jest bardzo proste – i o to właśnie chodzi. Natomiast za tą fasadą kryje się o wiele więcej bardziej skomplikowanych operacji, tj.:

  • uwierzytelnienie właściciela konta,
  • sprawdzenie kodu bezpieczeństwa (PIN),
  • sprawdzenie ilości pieniędzy,
  • wykonanie operacji powiększania i pomniejszania kwoty.

Wszystkie te funkcjonalności ukryte są za fasadą konta bankowego. Zajmijmy się ich implementacją.

W pierwszej kolejności napiszmy prostą klasę powitalną dla konta bankowego:

Następnie napiszmy klasę sprawdzająca numer konta i jego aktywność oraz klasę sprawdzającą kod zabezpieczający:

Numer konta i kod są w powyższych klasach predefiniowane, natomiast w prawdziwym systemie te dane pochodziłby prawdopodobnie z bazy danych. Nie jest to jednak potrzebne do przedstawienia idei wzorca.

Kolejnym elementem aplikacji jest klasa realizująca działania na kwocie zdeponowanej w banku:

W powyższej klasie początkowa kwota na koncie jest przykładowa i na tej kwocie wykonywane są różne funkcje bankowe.

Mając napisane już wszystkie elementy aplikacji zabierzmy się za napisanie fasady, tzn. klasy agregującej wszystkie funkcjonalności oraz dostarczającej klientowi uproszczony interfejs do obsługi konta bankowego.

Testowe wywołanie działania aplikacji zaprezentowane zostało na początku artykułu, a wynik prezentuje się następująco:

Użytkownik mająca na koncie wartość 1000, najpierw wypłaca 50, następnie wypłaca 900, a później wpłaca 200 i jak do tej pory wszystkie te operacje przechodzą bezproblemowo. Następnie próbuje wypłacić więcej środków niż zostało mu na rachunku i tutaj system zgłasza błąd. Jak widzimy wszystkie elementy aplikacji zadziałały poprawnie.

Wszystkie części systemu są oddzielone od siebie i realizują pojedyncze czynności. Można je łatwo rozszerzać lub dopisywać nowe funkcjonalności. Klasa fasady spaja cały system w jeden spójny, łatwy w użyciu interfejs.

Powyższy przykład można pobrać tutaj: bank-account

Przykład na GitHub: https://github.com/molitorys/design-patterns/tree/master/src/Facade/BankAccount

 


Przeczytaj równierz