Pular para conteúdo

Projeto 13: Padrões Comportamentais: Strategy, Observer e Command 📡

Escopo do Projeto

Objetivo: Orquestrar a comunicação dinâmica e desacoplada entre objetos utilizando Strategy para variação de algoritmos, Observer para eventos reativos e Command para encapsulamento de ações com suporte a Undo/Redo.


🎯 1. Contexto & Desafio Prático

Em um sistema de edição de documentos ou processamento de pedidos, ações precisam ser executadas, enfileiradas, revertidas e notificadas para múltiplos observadores. Você construirá o núcleo de um editor colaborativo aplicando Strategy para ordenação, Command para execução e reversão de ações, e Observer para emissão de telemetria.


📋 2. Requisitos Técnicos Obrigatórios

  • R1 (Strategy Pattern): Implementar interface Strategy para diferentes algoritmos de compressão de texto (Gzip vs Zstd).
  • R2 (Observer Pattern): Construir Subject com métodos attach(), detach() e notify(), notificando múltiplos loggers a cada alteração.
  • R3 (Command Pattern com Undo): Encapsular operações de inserção e exclusão em objetos Command mantendo pilha de histórico para reversão (undo).
  • R4 (Demonstração Interativa): Executar sequência de comandos, demonstrar a notificação dos observers e reverter comandos com sucesso.

📐 3. Diagrama Conceitual & Arquitetura

graph LR
    User["Editor UI"] --> Command["Command: InsertTextCommand('Olá')"]
    Command --> Exec["Executar Ação & Empilhar no Histórico de Undo"]
    Exec --> Subject["DocumentSubject (Observer)"]
    Subject --> Ob1["UI Viewer (Atualiza Tela)"]
    Subject --> Ob2["AutoSave Logger (Grava Disco)"]
    User -->|Pressiona Ctrl+Z| Undo["Command.undo() -> Reverte Estado!"]
    style User fill:#e1f5fe,stroke:#01579b
    style Command fill:#fff3e0,stroke:#e65100
    style Subject fill:#f3e5f5,stroke:#7b1fa2
    style Undo fill:#ffebee,stroke:#c62828

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

// behavioral_patterns.py
from abc import ABC, abstractmethod

class Command(ABC):
    @abstractmethod
    def execute(self) -> None: pass
    @abstractmethod
    def undo(self) -> None: pass

class Document:
    def __init__(self):
        self.content = ""

class InsertCommand(Command):
    def __init__(self, doc: Document, text: str):
        self.doc = doc
        self.text = text
    def execute(self):
        self.doc.content += self.text
    def undo(self):
        self.doc.content = self.doc.content[:-len(self.text)]

class EditorHistory:
    def __init__(self):
        self._history = []
    def push(self, cmd: Command):
        cmd.execute()
        self._history.append(cmd)
    def undo(self):
        if self._history:
            cmd = self._history.pop()
            cmd.undo()

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

  1. Padrão Command executando e desfazendo ações com integridade de estado.
  2. Padrão Observer emitindo notificações sem acoplamento aos ouvintes.
  3. Padrão Strategy permitindo alternância de algoritmos em tempo de execução.