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()enotify(), 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
- Padrão Command executando e desfazendo ações com integridade de estado.
- Padrão Observer emitindo notificações sem acoplamento aos ouvintes.
- Padrão Strategy permitindo alternância de algoritmos em tempo de execução.