Wzorzec Projektowy Fasada
Wzorzec projektowy Fasada to jeden z najprostszych wzorców projektowych, który pozwala na uproszczenie interakcji z złożonym systemem, poprzez stworzenie prostego interfejsu dla użytkownika.

Implementacja wzorca Fasada polega na stworzeniu klasy fasady, która dostarcza prosty interfejs użytkownika do złożonego systemu. Fasada ukrywa szczegóły funkcjonowania systemu, a użytkownik korzysta tylko z prostych metod dostarczonych przez fasadę.
W praktyce, klasa fasady tworzy „jedno okno” do złożonego systemu, co pozwala użytkownikowi na korzystanie z różnych funkcjonalności bez potrzeby wiedzy na temat jego złożonej struktury.
Dzięki temu wzorzec Fasada pozwala na uproszczenie i usprawnienie kodu, a także na zmniejszenie zależności między komponentami systemu. Dodatkowo, pozwala on na łatwiejsze testowanie kodu, ponieważ testowanie poszczególnych funkcjonalności systemu może odbywać się oddzielnie od testowania fasady.
Podstawowe elementy wzorca Fasada
Fasada – czyli klasa, która udostępnia prosty interfejs użytkownikom, ukrywając wewnętrzną złożoność systemu.
Klient – użytkownik lub inny element systemu korzystający z fasady.
Podsystem – złożona struktura systemu, którą fasada upraszcza.
Metody Fasady – metody, które udostępniają uproszczony interfejs dla klienta i wywołują odpowiednie metody w podsystemach w celu wykonania żądanych operacji.
Przykładem zastosowania wzorca Fasada może być system bankowy, gdzie fasada dostarcza prosty interfejs użytkownika do różnych funkcjonalności systemu, takich jak logowanie, przeglądanie salda, dokonywanie przelewów itp. Dzięki fasadzie użytkownik nie musi znać złożonej struktury systemu bankowego, a jedynie korzysta z prostych i intuicyjnych metod dostarczanych przez fasadę.
Przykład implementacji we wzorcu Fasada
// Niech nasza aplikacja będzie złożonym systemem bankowym składającym się z wielu klas, takich jak KontoBankowe, Przelew, KartaDebetowa itp.
Aby uprościć interakcję użytkownika z tym systemem oraz oddzielić go od kluczowych funkcji systemu tworzymy klasę fasady FasadaBanku, która będzie udostępniała prosty interfejs do tych klas.
public class KontoBankowe {
private int numerKonta;
private double saldo;
public KontoBankowe(int numerKonta, double saldo) {
this.numerKonta = numerKonta;
this.saldo = saldo;
}
public void wplac(double kwota) {
saldo += kwota;
}
public void wyplac(double kwota) {
saldo -= kwota;
}
public double getSaldo() {
return saldo;
}
}
public class Przelew {
private int numerKontaZrodlowego;
private int numerKontaDocelowego;
private double kwota;
public Przelew(int numerKontaZrodlowego, int numerKontaDocelowego, double kwota) {
this.numerKontaZrodlowego = numerKontaZrodlowego;
this.numerKontaDocelowego = numerKontaDocelowego;
this.kwota = kwota;
}
public void wykonaj() {
// Kod wykonujący przelew
}
}
public class KartaDebetowa {
private int numerKarty;
private double limit;
public KartaDebetowa(int numerKarty, double limit) {
this.numerKarty = numerKarty;
this.limit = limit;
}
public boolean czyMoznaPlacic(double kwota) {
return kwota <= limit;
}
public void zaplac(double kwota) {
// Kod dokonujący płatności kartą debetową
}
}
public class FasadaBanku {
private KontoBankowe kontoBankowe;
private Przelew przelew;
private KartaDebetowa kartaDebetowa;
public FasadaBanku(KontoBankowe kontoBankowe, Przelew przelew, KartaDebetowa kartaDebetowa) {
this.kontoBankowe = kontoBankowe;
this.przelew = przelew;
this.kartaDebetowa = kartaDebetowa;
}
public void wplacNaKonto(double kwota) {
kontoBankowe.wplac(kwota);
}
public void wyplacZKonta(double kwota) {
kontoBankowe.wyplac(kwota);
}
public double sprawdzSaldo() {
return kontoBankowe.getSaldo();
}
public void wykonajPrzelew() {
przelew.wykonaj();
}
public boolean czyMoznaPlacicKarta(double kwota) {
return kartaDebetowa.czyMoznaPlacic(kwota);
}
public void zaplacKarta(double kwota) {
kartaDebetowa.zaplac(kwota);
}
}