Pular para conteúdo

Projeto 12: Padrões Estruturais: Adapter, Decorator e Facade 🔌

Escopo do Projeto

Objetivo: Construir arquiteturas estruturais desacopladas combinando Adapter (compatibilização de legado), Decorator (agregação de comportamento em runtime) e Facade (simplificação de subsistemas complexos).


🎯 1. Contexto & Desafio Prático

A integração de bibliotecas de terceiros ou sistemas legados frequentemente desafia a arquitetura. Você construirá uma suíte de processamento de áudio/streaming onde um Adapter adapta uma biblioteca legada em C, Decorators adicionam compressão e cache em runtime, e uma Facade simplifica a interface para o cliente final.


📋 2. Requisitos Técnicos Obrigatórios

  • R1 (Adapter Pattern): Criar classe adaptadora que converte chamadas da interface moderna para a assinatura de uma biblioteca legada.
  • R2 (Decorator Pattern): Implementar decoradores intercambiáveis para adicionar log de auditoria, criptografia e compressão em tempo de execução.
  • R3 (Facade Pattern): Desenvolver uma classe Facade com método simples processar_midia(arquivo) que orquestra todo o subsistema interno.
  • R4 (Transparência para o Cliente): O cliente interage apenas com a Facade ou com a interface decorada sem conhecer a complexidade interna.

📐 3. Diagrama Conceitual & Arquitetura

graph TD
    Client["Cliente da Aplicação"] --> Facade["MediaProcessingFacade (Interface Simples)"]
    Facade --> Adapter["AudioLibAdapter (Compatibiliza API Legada)"]
    Facade --> Decorator1["LoggingDecorator"]
    Decorator1 --> Decorator2["CompressionDecorator"]
    Decorator2 --> Engine["Core Media Engine"]
    style Client fill:#e1f5fe,stroke:#01579b
    style Facade fill:#fff3e0,stroke:#e65100
    style Adapter fill:#f3e5f5,stroke:#7b1fa2
    style Decorator1 fill:#e8f5e9,stroke:#2e7d32
    style Decorator2 fill:#e8f5e9,stroke:#2e7d32

💻 4. Especificação Técnica & Código de Referência

// structural_patterns.py
from abc import ABC, abstractmethod

class Notifier(ABC):
    @abstractmethod
    def send(self, msg: str): pass

class EmailNotifier(Notifier):
    def send(self, msg: str):
        print(f"Enviando e-mail: {msg}")

# Decorator Base
class NotifierDecorator(Notifier):
    def __init__(self, wrappee: Notifier):
        self._wrappee = wrappee
    def send(self, msg: str):
        self._wrappee.send(msg)

class SMSDecorator(NotifierDecorator):
    def send(self, msg: str):
        super().send(msg)
        print(f"Enviando SMS adicional: {msg}")

# Facade Simplificadora
class AlertFacade:
    def __init__(self):
        self.notifier = SMSDecorator(EmailNotifier())
    def alert_critical(self, text: str):
        self.notifier.send(f"[CRÍTICO] {text}")

📦 5. Critérios de Avaliação e Entrega

  1. Aplicação correta dos três padrões no mesmo fluxo funcional.
  2. Decorators encadeados agregando comportamento sem herança múltipla.
  3. Facade unificando a inicialização de subsistemas complexos.