Sobes.tech
Middle

Cos'è il pattern Facade?

sobes.tech AI

Risposta dell'AI

Il pattern "Finestra" (Facade) è un pattern strutturale che fornisce un'interfaccia semplificata a un sistema complesso di classi, librerie o sottosistemi. Nasconde i dettagli di implementazione del sottosistema e fornisce un punto di ingresso unico per eseguire operazioni tipiche.

Obiettivo:

  • Semplificare l'uso di un sistema complesso.
  • Ridurre le dipendenze tra il client e il sottosistema.
  • Rendere il sottosistema più flessibile ai cambiamenti.

Struttura:

  • Finestra (Facade): Fornisce un'interfaccia semplice per il client. Delegates requests to the appropriate subsystem objects.
  • Classi del sottosistema: Implementano la funzionalità del sottosistema. Non sono consapevoli della Finestra.

Esempio in Python:

# Classi del sottosistema complesso
class AudioMixer:
    def __init__(self):
        print("AudioMixer: Inizializzazione...")

    def configure(self, type):
        print(f"AudioMixer: Configurazione per {type}...")

    def set_volume(self, level):
        print(f"AudioMixer: Impostazione volume a {level}...")

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

    def set_resolution(self, res):
        print(f"VideoRenderer: Impostazione risoluzione a {res}...")

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

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

    def load(self, file):
        print(f"SubtitleManager: Caricamento sottotitoli da {file}...")

    def sync(self):
        print("SubtitleManager: Sincronizzazione sottotitoli...")

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

    def convert_video(self, filename):
        print("\nVideoConverterFacade: Inizio conversione video...")
        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): # Simulazione di elaborazione frame
            self._video_renderer.render(i)
        self._audio_mixer.set_volume(5)
        print("VideoConverterFacade: Conversione video completata.\n")

# Codice cliente
# Senza la Finestra, il cliente dovrebbe interagire
# direttamente con tutte le classi del sottosistema.
# mixer = AudioMixer()
# renderer = VideoRenderer()
# subtitles = SubtitleManager()
# ... molte righe di codice ...

# Con la Finestra, il cliente interagisce solo con la Finestra
facade = VideoConverterFacade()
facade.convert_video("film_mio")

Quando usare:

  • Quando si desidera fornire un'interfaccia semplice a un sottosistema complesso.
  • Quando ci sono molte dipendenze tra clienti e classi del sottosistema.
  • Per suddividere il sottosistema in livelli.

Vantaggi:

  • Semplifica l'interazione con il sottosistema.
  • Riduce il legame tra cliente e sottosistema.
  • Facilita la modifica o la sostituzione del sottosistema.

Svantaggi:

  • La Finestra può diventare un "oggetto divino" (God Object) se include troppe funzionalità.
  • Potrebbe nascondere dettagli importanti che potrebbero essere necessari agli utenti avanzati del sottosistema.

In generale, la Finestra è un modo comodo per organizzare il codice e migliorare la leggibilità e l'usabilità di sistemi complessi.