Wzorzec projektowy Facade (Fasada) należy do grupy wzorców strukturalnych. Jego rolą jest uproszczenie złożonego interfejsu lub jego uporządkowanie. Czasami występuje potrzeba skorzystania z gotowego, niejednokrotnie rozbudowanego systemu albo biblioteki. Jednocześnie nie ma potrzeby wykorzystania całego dostępnego API lub to API jest nieprzejrzyste. Buduje się wtedy obiekty pośredniczące pomiędzy starym systemem, a systemem który z niego korzysta.
Kiedy wykorzystuje się wzorzec Fasada:
- aby ukryć złożoność tworzonego systemu przez dostarczenie udokumentowanego, publicznego API. Definiujemy dozwolony dostęp do API przez co redukujemy ilość możliwych przypadków błędnego użycia. Programiści muszą przyswoić sobie API fasady a nie całego systemu. Bardzo przydaje się to wtedy, gdy biblioteka jest długo rozwijana i jest duża ilość przedawnionych metod. Fasada odświerza API skupiając się jedynie na operacjach aktualnych.
- aby uprościć używanie cudzej biblioteki. Definiuje się wygodne, dostosowane do konkretnego zastosowania metody pośredniczące między systemami. Zwiększa się czytelność kodu.
- aby poprawić użyteczność biblioteki ze źle skonstruowanym API przez stworzenie nakładki, która dostarcza nowe, uporządkowane API.
Zasada działania:
Fasada jest obiektem pośredniczącym między klasami klienta wywołującego operacje a klasami, które te operacje wykonują. Najczęściej Fasadę definiuje się jako Singleton, ponieważ w systemie jest tylko jedna. Obiekt fasady wie, które klasy ukrywanego systemu są odpowiedzialne za wykonanie danego żądania i przekazuje odpowiednie wywołania do właściwych obiektów systemu. Ukrywane klasy wykonują zlecone operacje nie wiedząc nawet, że jest coś takiego w systemie jak Fasada.
Przykład:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
public class Klasa1 { public void metoda1() { //jakaś funkcjonalność } public void medtoda2() { //.. tutaj też coś } } public class Klasa2 { public void metoda1() { //... trochę kodu } public void metoda2() { //... jeszcze trochę } } public class Fasada { public void metoda1() { Klasa1 k1 = new Klasa1(); k1.metoda1(); } public void metoda2() { Klasa2 k2 = new Klasa2(); k2.metoda2(); } } |