Fasada (ang. Facade) umożliwia on stworzenie jednolitego interfejsu dla złożonych systemów. W tym artykule omówimy, dlaczego wzorzec Fasada jest użyteczny, jak działa, oraz przedstawimy przykład jego implementacji.
Dlaczego Fasada?
W miarę rozwoju projektu oprogramowania, często zaczynamy korzystać z rozbudowanych systemów, które składają się z wielu komponentów. W takiej sytuacji, zastosowanie wzorca Fasada pozwala na stworzenie jednolitego interfejsu, który ukrywa złożoność systemu i umożliwia łatwe korzystanie z jego funkcji. Wzorzec ten wprowadza jedno miejsce, przez które klient komunikuje się z całym systemem, co zdecydowanie ułatwia zrozumienie i użycie funkcji dostępnych w systemie.
Jak działa Fasada?
Wzorzec Fasada jest realizowany poprzez utworzenie klasy, zwanej fasadą, która udostępnia uproszczony interfejs dla komunikacji z jednym lub wieloma podsystemami. Kluczowym jest to, że fasada ukrywa szczegóły implementacyjne i złożoność systemu od klienta, dostarczając mu jednolitego punktu dostępu.
Podstawowe składniki wzorca Fasada to:
- Fasada (Facade): Jest to klasa, która dostarcza prosty interfejs dla klienta, ukrywając złożoność systemu. Fasada koordynuje działanie różnych podsystemów.
- Podsystemy (Subsystem): Są to klasy lub moduły, które realizują konkretne funkcje w systemie. Fasada korzysta z podsystemów, aby dostarczyć klientowi oczekiwane funkcje.
Implementacja wzorca
W tym przykładzie, AudioSystemFacade jest fasadą, która dostarcza prosty interfejs (playMusic() i stopMusic()) dla klienta. Fasada korzysta z różnych podsystemów (AudioPlayer, Equalizer, Amplifier), ukrywając ich złożoność i szczegóły przed klientem. Klient nie musi znać wewnętrznej struktury systemu audio; wystarczy mu interfejs dostarczany przez fasadę.
// Podsystemy
class AudioPlayer {
void play() {
System.out.println("Playing audio");
}
}
class Equalizer {
void setEqualizer(int level) {
System.out.println("Setting equalizer level to " + level);
}
}
class Amplifier {
void setVolume(int volume) {
System.out.println("Setting volume to " + volume);
}
}
// Fasada
class AudioSystemFacade {
private AudioPlayer audioPlayer;
private Equalizer equalizer;
private Amplifier amplifier;
public AudioSystemFacade() {
this.audioPlayer = new AudioPlayer();
this.equalizer = new Equalizer();
this.amplifier = new Amplifier();
}
// Prosty interfejs dla klienta
public void playMusic() {
audioPlayer.play();
equalizer.setEqualizer(2);
amplifier.setVolume(10);
}
public void stopMusic() {
System.out.println("Stopping music");
}
}
// Klient
public class Client {
public static void main(String[] args) {
// Użycie fasady do obsługi systemu audio
AudioSystemFacade audioSystem = new AudioSystemFacade();
audioSystem.playMusic();
// Dalsza interakcja z systemem audio za pomocą fasady
audioSystem.stopMusic();
}
}