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
- Aplicação correta dos três padrões no mesmo fluxo funcional.
- Decorators encadeados agregando comportamento sem herança múltipla.
- Facade unificando a inicialização de subsistemas complexos.