Przejdź do treści

Wzorzec projektowy fasada

  • przez

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:

  1. 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.
  2. 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();
    }
}