Sobes.tech
Middle

Wat is het façade-patroon (Facade)?

sobes.tech AI

Antwoord van AI

Het patroon "Fasade" (Facade) is een structureel ontwerppatroon dat een vereenvoudigde interface biedt voor een complex systeem van klassen, bibliotheken of subsystemen. Het verbergt de implementatiedetails van het subsysteem en biedt één toegangspunt voor het uitvoeren van typische operaties.

Doel:

  • Het gebruik van een complex systeem vereenvoudigen.
  • De afhankelijkheden tussen de klant en het subsysteem verminderen.
  • Het subsysteem flexibeler maken bij veranderingen.

Structuur:

  • Fasade (Facade): Biedt een eenvoudige interface voor de klant. Delegeert verzoeken naar de juiste subsystemen.
  • Klassen van het subsysteem: Implementeren de functionaliteit van het subsysteem. Zijn zich niet bewust van de Fasade.

Voorbeeld in Python:

# Klassen van het complexe subsysteem
class AudioMixer:
    def __init__(self):
        print("AudioMixer: Initialiseren...")

    def configure(self, type):
        print(f"AudioMixer: Configureren voor {type}...")

    def set_volume(self, level):
        print(f"AudioMixer: Volume instellen op {level}...")

class VideoRenderer:
    def __init__(self):
        print("VideoRenderer: Initialiseren...")

    def set_resolution(self, res):
        print(f"VideoRenderer: Resolutie instellen op {res}...")

    def render(self, frame):
        print(f"VideoRenderer: Frame {frame} renderen...")

class SubtitleManager:
    def __init__(self):
        print("SubtitleManager: Initialiseren...")

    def load(self, file):
        print(f"SubtitleManager: Ondertitels laden uit {file}...")

    def sync(self):
        print("SubtitleManager: Ondertitels synchroniseren...")

# Fasad patroon
class VideoConverterFacade:
    def __init__(self):
        self._audio_mixer = AudioMixer()
        self._video_renderer = VideoRenderer()
        self._subtitle_manager = SubtitleManager()

    def convert_video(self, filename):
        print("\nVideoConverterFacade: Video conversie starten...")
        self._audio_mixer.configure("stereo")
        self._video_renderer.set_resolution("1080p")
        self._subtitle_manager.load(f"{filename}.srt")
        self._subtitle_manager.sync()
        for i in range(3): # Simulatie van frameverwerking
            self._video_renderer.render(i)
        self._audio_mixer.set_volume(5)
        print("VideoConverterFacade: Video conversie voltooid.\n")

# Klantcode
# Zonder de Fasad zou de klant
# direct met alle klassen van het subsysteem moeten werken.
# mixer = AudioMixer()
# renderer = VideoRenderer()
# subtitles = SubtitleManager()
# ... veel code ...

# Met de Fasad, werkt de klant alleen met de Fasad
facade = VideoConverterFacade()
facade.convert_video("mijn_film")

Wanneer gebruiken:

  • Wanneer je een eenvoudige interface wilt bieden voor een complex subsysteem.
  • Wanneer er veel afhankelijkheden zijn tussen klanten en de klassen van het subsysteem.
  • Om het subsysteem in lagen te verdelen.

Voordelen:

  • Vereenvoudigt de interactie met het subsysteem.
  • Vermindert de koppeling tussen klant en subsysteem.
  • Maakt het makkelijker om het subsysteem te wijzigen of te vervangen.

Nadelen:

  • De Fasad kan een "God Object" worden als het te veel functionaliteit bevat.
  • Kan belangrijke details verbergen die nodig kunnen zijn voor gevorderde gebruikers van het subsysteem.

Over het algemeen is de Fasad een handige manier om de code te organiseren en de leesbaarheid en bruikbaarheid van complexe systemen te verbeteren.