Sobes.tech
Middle

¿Qué es el patrón fachada (Facade)?

sobes.tech AI

Respuesta de la IA

El patrón "Fachada" (Facade) es un patrón de diseño estructural que proporciona una interfaz simplificada a un sistema complejo de clases, biblioteca o subsistema. Oculta los detalles de implementación del subsistema y proporciona un único punto de entrada para realizar operaciones típicas.

Objetivo:

  • Simplificar el uso de un sistema complejo.
  • Reducir las dependencias entre el cliente y el subsistema.
  • Hacer que el subsistema sea más flexible ante cambios.

Estructura:

  • Fachada (Facade): Proporciona una interfaz sencilla para el cliente. Delegates requests to the appropriate subsystem objects.
  • Clases del subsistema: Implementan la funcionalidad del subsistema. No están conscientes de la Fachada.

Ejemplo en Python:

# Clases del subsistema complejo
class AudioMixer:
    def __init__(self):
        print("AudioMixer: Inicializando...")

    def configure(self, type):
        print(f"AudioMixer: Configurando para {type}...")

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

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

    def set_resolution(self, res):
        print(f"VideoRenderer: Ajustando resolución a {res}...")

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

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

    def load(self, file):
        print(f"SubtitleManager: Cargando subtítulos desde {file}...")

    def sync(self):
        print("SubtitleManager: Sincronizando subtítulos...")

# Patrón Fachada
class VideoConverterFacade:
    def __init__(self):
        self._audio_mixer = AudioMixer()
        self._video_renderer = VideoRenderer()
        self._subtitle_manager = SubtitleManager()

    def convert_video(self, filename):
        print("\nVideoConverterFacade: Iniciando conversión de video...")
        self._audio_mixer.configure("estéreo")
        self._video_renderer.set_resolution("1080p")
        self._subtitle_manager.load(f"{filename}.srt")
        self._subtitle_manager.sync()
        for i in range(3): # Simulación de procesamiento de cuadros
            self._video_renderer.render(i)
        self._audio_mixer.set_volume(5)
        print("VideoConverterFacade: Conversión de video finalizada.\n")

# Código cliente
# Sin la Fachada, el cliente tendría que interactuar
# directamente con todas las clases del subsistema.
# mixer = AudioMixer()
# renderer = VideoRenderer()
# subtitles = SubtitleManager()
# ... muchas líneas de código para interactuar ...

# Con la Fachada, el cliente solo interactúa con la Fachada
facade = VideoConverterFacade()
facade.convert_video("mi_pelicula")

Cuándo usar:

  • Cuando necesitas proporcionar una interfaz sencilla a un sistema complejo.
  • Cuando hay muchas dependencias entre los clientes y las clases del subsistema.
  • Para dividir el subsistema en capas.

Ventajas:

  • Simplifica la interacción con el subsistema.
  • Reduce el acoplamiento entre el cliente y el subsistema.
  • Facilita el cambio o reemplazo del subsistema.

Desventajas:

  • La Fachada puede convertirse en un "objeto divino" (God Object) si incluye demasiada funcionalidad.
  • Puede ocultar detalles importantes que podrían ser necesarios para usuarios avanzados del subsistema.

En general, la Fachada es una forma conveniente de organizar el código y mejorar la legibilidad y facilidad de uso de sistemas complejos.