Padrões de Design em Java¶
Um padrão de design nomeia um problema de design recorrente, seu contexto, uma estrutura de colaboração e suas consequências. Não é um modelo de código e não deve ser adicionado quando uma implementação direta é mais clara.
Famílias de padrões¶
| Família | Propósito | Exemplos |
|---|---|---|
| Criacional | Controlar criação de objetos | Factory Method, Abstract Factory, Builder |
| Estrutural | Compor tipos e objetos | Adapter, Decorator, Composite, Proxy |
| Comportamental | Distribuir algoritmos e responsabilidades | Strategy, Observer, Command, State, Template Method |
Strategy¶
Strategy transforma um algoritmo substituível em um colaborador explícito.
@FunctionalInterface
interface ShippingCost {
Money calculate(Parcel parcel);
}
final class Checkout {
private final ShippingCost shipping;
Checkout(ShippingCost shipping) {
this.shipping = shipping;
}
Money total(Order order, Parcel parcel) {
return order.subtotal().add(shipping.calculate(parcel));
}
}
Uma lambda pode implementar uma estratégia de método único. Comparator<T> é um exemplo
da biblioteca padrão de uma estratégia de ordenação intercambiável.
Factory e Builder¶
Uma factory centraliza uma decisão de criação quando os chamadores devem depender de um papel, não de um processo construtivo concreto. Um builder acumula dados de construção opcionais ou em etapas e valida antes de produzir o objeto final.
Não crie uma factory que apenas renomeia new sem decisão oculta,
invariante, ciclo de vida ou produto substituível.
Adapter, Decorator e Proxy¶
- Adapter traduz uma interface na interface que um cliente requer.
- Decorator adiciona comportamento preservando contrato do objeto envolto e geralmente delega o mesmo papel.
- Proxy controla o acesso a outro objeto, possivelmente para acesso remoto, avaliação tardia, segurança, transações ou observação.
Esses padrões podem assumir formas de wrapper semelhantes, mas possuem intenções diferentes. As classes de stream do Java contêm composições semelhantes a decorators; proxies dinâmicos fornecem um mecanismo para implementações de proxy.
Observer¶
Observers subscrevem notificações de um sujeito. Isso reduz conhecimento direto de receptores mas introduz questões de entrega, ordenação, falha, ciclo de vida e reentrância. Observação in-process não é automaticamente mensageria durável.
Command e State¶
Um command representa uma solicitação como objeto ou função, permitindo enfileiramento, registro de logs, novas tentativas, desfazer ou escalonamento quando a semântica permitir. State transfere o comportamento dependente do estado para objetos de estado explícitos, evitando condicionais grandes quando transições e comportamento são suficientemente complexos.
Template Method versus composição¶
Template Method define o esqueleto de um algoritmo em uma classe base e permite que subclasses sobrescrever etapas selecionadas. Strategy expressa variação por composição e é frequentemente mais flexível em Java. Template Method permanece útil quando o esqueleto e os pontos de extensão formam um contrato de herança estável.
Efeitos do Java moderno¶
Records reduzem código repetitivo em portadores de dados imutáveis, hierarquias sealed limitam variantes conhecidas, lambdas simplificam estratégias e commands, e pattern matching pode tornar modelos de estilo algébrico fechado mais claros. Essas características alteram implementações de padrão; não eliminam problemas de design subjacentes.
Perguntas de seleção de padrão¶
- Qual variação concreta ou problema de colaboração existe?
- Uma característica de linguagem ou biblioteca já é uma solução mais simples?
- Quais dependências e obrigações de ciclo de vida o padrão introduz?
- Como falha, concorrência e teste funcionarão?
- Outro mantenedor reconhecerá a intenção sem ler a classe inteira?
Exercícios¶
- Implemente canais de notificação como estratégias e então compare-os com Observer.
- Envolver um repositório com um decorator de caching e definir as semânticas de invalidation do cache.
- Explique como Adapter e Decorator diferem mesmo quando ambos contêm um objeto delegado.