Sobes.tech
Middle

O que é o padrão fachada (Facade)?

sobes.tech IA

Resposta da IA

O padrão "Fachada" (Facade) é um padrão de design estrutural que fornece uma interface simplificada a um sistema complexo de classes, biblioteca ou subsistema. Esconde os detalhes de implementação do subsistema e fornece um único ponto de entrada para realizar operações típicas.

Objetivo:

  • Simplificar o uso de um sistema complexo.
  • Reduzir as dependências entre o cliente e o subsistema.
  • Tornar o subsistema mais flexível às mudanças.

Estrutura:

  • Fachada (Facade): Fornece uma interface simples para o cliente. Delegates requests to the appropriate subsystem objects.
  • Classes do subsistema: Implementam a funcionalidade do subsistema. Não estão conscientes da Fachada.

Exemplo em Python:

# Classes do subsistema complexo
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 volume para {level}...")

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

    def set_resolution(self, res):
        print(f"VideoRenderer: Ajustando resolução para {res}...")

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

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

    def load(self, file):
        print(f"SubtitleManager: Carregando legendas de {file}...")

    def sync(self):
        print("SubtitleManager: Sincronizando legendas...")

# Padrão 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 conversão de vídeo...")
        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): # Simulação do processamento de quadros
            self._video_renderer.render(i)
        self._audio_mixer.set_volume(5)
        print("VideoConverterFacade: Conversão de vídeo concluída.\n")

# Código cliente
# Sem a Fachada, o cliente teria que interagir
# diretamente com todas as classes do subsistema.
# mixer = AudioMixer()
# renderer = VideoRenderer()
# subtitles = SubtitleManager()
# ... muitas linhas de código para interação ...

# Com a Fachada, o cliente interage apenas com a Fachada
facade = VideoConverterFacade()
facade.convert_video("meu_filme")

Quando usar:

  • Quando precisar fornecer uma interface simples a um subsistema complexo.
  • Quando há muitas dependências entre clientes e classes do subsistema.
  • Para dividir o subsistema em camadas.

Vantagens:

  • Simplifica a interação com o subsistema.
  • Reduz o acoplamento entre cliente e subsistema.
  • Facilita a mudança ou substituição do subsistema.

Desvantagens:

  • A Fachada pode se tornar um "objeto divino" (God Object) se incluir muita funcionalidade.
  • Pode esconder detalhes importantes que podem ser necessários para usuários avançados do subsistema.

No geral, a Fachada é uma maneira conveniente de organizar o código e melhorar a legibilidade e facilidade de uso de sistemas complexos.