Pular para o conteúdo
GoF Padrões de Projeto Distinções
Capítulo Vdoze duplas

Confunde-se com…

Vários padrões têm diagramas praticamente idênticos e se distinguem apenas pela intenção. Para cada dupla abaixo há uma única pergunta que resolve a dúvida.

Strategy contra State

Quem decide a troca?

Strategy

O cliente escolhe a estratégia; elas não se conhecem.

State

Os estados trocam a si mesmos e conhecem as transições válidas.

Strategy contra Template Method

Composição ou herança?

Strategy

Composição: troca o algoritmo inteiro em tempo de execução.

Template Method

Herança: fixa o esqueleto e varia só algumas etapas.

Decorator contra Proxy

Quem controla o objeto interno?

Decorator

O cliente empilha decoradores conforme quer enriquecer.

Proxy

O proxy normalmente cria e gerencia o objeto real sozinho.

Adapter contra Facade

Uma interface existente ou uma nova?

Adapter

Adapter faz um objeto caber numa interface que já existe.

Facade

Facade inventa uma interface nova e simples para vários objetos.

Facade contra Mediator

Os colegas conhecem o intermediário?

Facade

Não. O subsistema ignora a fachada; o fluxo é unidirecional.

Mediator

Sim. Os componentes falam com o mediador; o fluxo é bidirecional.

Factory Method contra Abstract Factory

Um produto ou uma família?

Factory Method

Um produto, definido por herança na subclasse do criador.

Abstract Factory

Uma família coerente, entregue por um objeto fábrica.

Composite contra Decorator

Quantos filhos?

Composite

Muitos — é uma árvore todo-parte.

Decorator

Exatamente um — é uma camada que enriquece.

Chain of Responsibility contra Decorator

Pode interromper?

Chain of Responsibility

Sim, um elo pode tratar e parar a propagação.

Decorator

Não, todas as camadas participam da chamada.

Observer contra Mediator

Um-para-muitos ou muitos-para-muitos?

Observer

Um publicador notifica N assinantes que ele não conhece.

Mediator

N colegas coordenam-se através de um hub que os conhece.

Bridge contra Strategy

Dimensão estrutural ou algoritmo?

Bridge

Bridge separa duas hierarquias que evoluem em paralelo.

Strategy

Strategy troca a forma de executar uma operação.

Command contra Strategy

O que é encapsulado?

Command

Uma AÇÃO completa a ser executada depois (com undo, fila, log).

Strategy

Um MODO de fazer algo, usado agora pelo contexto.

Memento contra Command

Estado ou operação?

Memento

Memento fotografa COMO estava.

Command

Command sabe O QUE foi feito e como reverter.

Comparador livre

Escolha até três padrões e leia-os linha a linha. Útil quando a dúvida não está na lista acima.

Família
Comportamental
Em uma frase
Vários algoritmos intercambiáveis para a mesma tarefa, escolhidos em tempo de execução.
Intenção
Definir uma família de algoritmos, encapsular cada um deles e torná-los intercambiáveis. Strategy permite que o algoritmo varie independentemente dos clientes que o utilizam.
Analogia
O aplicativo de rotas
Escopo
de objeto
Complexidade
simples
Frequência
muito comum
Maior vantagem
Troca algoritmos em tempo de execução.
Maior custo
O cliente precisa conhecer as diferenças entre as estratégias para escolher.
Use quando
Você tem muitas variantes de um mesmo algoritmo e quer trocá-las em tempo de execução.
Aparece em
java.util.Comparator — a estratégia de ordenação
Abrir a ficha
Família
Comportamental
Em uma frase
O objeto parece mudar de classe quando seu estado interno muda.
Intenção
Permitir que um objeto altere seu comportamento quando seu estado interno muda. O objeto parecerá ter mudado de classe.
Analogia
O botão do celular
Escopo
de objeto
Complexidade
média
Frequência
moderada
Maior vantagem
Cada estado numa classe (Responsabilidade Única).
Maior custo
Exagero quando há poucos estados ou eles mudam raramente.
Use quando
Um objeto se comporta de forma muito diferente conforme o estado, e os estados mudam com frequência.
Aparece em
javax.faces.lifecycle.LifeCycle
Abrir a ficha
Família
Estrutural
Em uma frase
Empilhe comportamentos em tempo de execução, envolvendo o objeto em camadas.
Intenção
Anexar responsabilidades adicionais a um objeto dinamicamente. Decorators oferecem uma alternativa flexível ao uso de subclasses para estender funcionalidade.
Analogia
Vestir-se em camadas
Escopo
de objeto
Complexidade
média
Frequência
muito comum
Maior vantagem
Estende comportamento sem criar subclasses.
Maior custo
Difícil remover um wrapper específico do meio da pilha.
Use quando
Você precisa acrescentar comportamento a objetos em tempo de execução sem quebrar o resto.
Aparece em
java.io: new BufferedReader(new InputStreamReader(new FileInputStream(f)))
Abrir a ficha