Escolar Documentos
Profissional Documentos
Cultura Documentos
Padrões de Projeto
Command, Memento, Visitor, Observer, Mediator
O Command é um padrão de
projeto comportamental que
transforma um pedido em um
objeto independente que contém
toda a informação sobre o pedido.
Problema
5 O Cliente cria e
3 Comandos Concretos
configura objetos implementam vários
comando concretos. tipos de pedidos
method undo() is
editor.text = backup
method undo() is
command = history.pop()
if (command != null)
command.undo()
Aplicabilidade
• Utilize o padrão Command quando você quer parametrizar objetos com operações.
• Utilize o padrão Command quando você quer colocar operações em fila, agendar sua execução, ou executá-las
remotamente.
• Utilize o padrão Command quando você quer implementar operações reversíveis.
Como implementar
• Declara a interface comando com um único método de execução.
• Começa extraindo pedidos para dentro de classes concretas comando que implementam a interface comando.
• Identifique classes que vão agir como remetentes
• Mudar os remetentes para que executem o comando ao invés de enviar o pedido para o destinatário diretamente.
• O cliente deve inicializar objetos na seguinte ordem:
– Crie os destinatários.
– Crie os comandos, e os associe com os destinatários se necessário.
– Crie os remetentes, e os associe com os comandos específicos.
Relações com outros padrões
• O Chain of Responsibility, Command, Mediator e Observer abrangem várias maneiras de se conectar remetentes
e destinatários de pedidos:
– O Chain of Responsibility passa um pedido sequencialmente ao longo de um corrente dinâmica de potenciais
destinatários até que um deles atua no pedido.
– O Command estabelece conexões unidirecionais entre remetentes e destinatários.
– O Mediator elimina as conexões diretas entre remetentes e destinatários, forçando-os a se comunicar
indiretamente através de um objeto mediador.
– O Observer permite que destinatários inscrevam-se ou cancelem sua inscrição dinamicamente para receber
pedidos.
Relações com outros padrões
• Você pode usar o Command e o Memento juntos quando implementando um “desfazer”. Neste caso, os
comandos são responsáveis pela realização de várias operações sobre um objeto alvo, enquanto que os mementos
salvam o estado daquele objeto momentos antes de um comando ser executado.
• Handlers em uma Chain of Responsibility podem ser implementados como comandos. Neste caso, você pode
executar várias operações diferentes sobre o mesmo objeto contexto, representado por um pedido.
– Contudo, há outra abordagem, onde o próprio pedido é um objeto comando. Neste caso, você pode executar
a mesma operação em uma série de diferentes contextos ligados em uma corrente.
Relações com outros padrões
• O Command e o Strategy podem ser parecidos porque você pode usar ambos para parametrizar um objeto com
alguma ação. Contudo, eles têm propósitos bem diferentes.
– Você pode usar o Command para converter qualquer operação em um objeto. Os parâmetros da operação se
transformam em campos daquele objeto. A conversão permite que você atrase a execução de uma operação,
transforme-a em uma fila, armazene o histórico de comandos, envie comandos para serviços remotos, etc.
– Por outro lado, o Strategy geralmente descreve diferentes maneiras de fazer a mesma coisa, permitindo que
você troque esses algoritmos dentro de uma única classe contexto.
Memento
Restauração do estado de um objeto de forma segura
Propósito
O Memento é um padrão de projeto
comportamental que permite que você salve
e restaure o estado anterior de um objeto
sem revelar os detalhes de sua
implementação.
Problema
Como um objeto pode capturar seu estado
anterior para poder ser restaurado
posteriormente?
você ou expõe todos os detalhes internos
das classes tornando-as frágeis, ou
restringe o acesso ao estado delas,
tornando impossível produzir retratos.
Existe alguma outra maneira de
implementar o "desfazer"?
Solução
O padrão sugere armazenar a cópia do estado
de um objeto em um objeto especial chamado
memento. Os conteúdos de um memento não
são acessíveis para qualquer outro objeto
exceto aquele que o produziu. Outros objetos
podem se comunicar com mementos usando
uma interface limitada que pode permitir a
recuperação dos metadados do retrato (data de
criação, nome a operação efetuada, etc.), mas
não ao estado do objeto original contido no
retrato.
Estrutura
1 - A classe Originadora pode 2 - O Memento é um objeto de valor que age como 3 - A Cuidadora sabe não só
produzir retratos de seu um retrato do estado da originadora. É uma prática “quando” e “por quê” capturar o
próprio estado, bem como comum fazer o memento imutável e passar os dados estado da originadora, mas também
restaurar seu estado de retratos para ele apenas uma vez, através do construtor. quando o estado deve ser restaurado.
quando necessário. Uma cuidadora pode manter
registros do histórico da originadora
armazenando os mementos em um
pilha. Quando a originadora precisa
voltar atrás no histórico, a cuidadora
busca o memento mais do topo da
pilha e o passa para o método de
restauração da originadora.
method setText(text) is
this.text = text
method setCursor(x, y) is
this.curX = x
this.curY = y
method setSelectionWidth(width) is
this.selectionWidth = width
method createSnapshot():Snapshot is
return new Snapshot(this, text, curX, curY, selectionWidth)
Exemplo de código
class Snapshot is
private field editor: Editor
private field text, curX, curY, selectionWidth
method restore() is
editor.setText(text)
editor.setCursor(curX, curY)
editor.setSelectionWidth(selectionWidth)
Exemplo de código
class Command is
private field backup: Snapshot
method makeBackup() is
backup = editor.createSnapshot()
method undo() is
if (backup != null)
backup.restore()
Aplicabilidade
• Utilize o padrão Memento quando você quer produzir retratos do estado de um objeto para ser capaz de restaurar
um estado anterior do objeto.
• Utilize o padrão quando o acesso direto para os campos/getters/setters de um objeto viola seu encapsulamento.
Prós e contras
PRÓS CONTRAS
• Você pode produzir retratos do estado • A aplicação pode consumir muita
de um objeto sem violar seu RAM se os clientes criarem mementos
encapsulamento. com muita frequência.
• Cuidadoras devem acompanhar o ciclo
• Você pode simplificar o código da de vida da originadora para serem
originadora permitindo que a capazes de destruir mementos
cuidadora mantenha o histórico do obsoletos.
estado da originadora. • A maioria das linguagens de
programação dinâmicas, tais como
PHP, Python, e JavaScript, não
conseguem garantir que o estado
dentro do memento permaneça
intacto.
Visitor
Novos comportamentos sem sobrecarga de responsabilidades
Propósito
O Visitor é um padrão de projeto
comportamental que permite que você separe
algoritmos dos objetos nos quais eles operam.
Problema
Ao adicionar um novo comportamento ao
sistema, isso deve ser aplicado a todas as
classes necessárias, como aplicar essa
funcionalidade mantendo o princípio de
responsabilidade única?
Solução
O padrão Visitor sugere que você coloque o
novo comportamento em uma classe
separada chamada visitante, ao invés de
tentar integrá-lo em classes já existentes. O
objeto original que teve que fazer o
comportamento é agora passado para um dos
métodos da visitante como um argumento,
desde que o método acesse todos os dados
necessários contidos dentro do objeto.
Estrutura
5 - O Cliente geralmente representa uma coleção de outros objetos complexos (por exemplo, uma árvore Composite
). Geralmente, os clientes não estão cientes de todos as classes elemento concretas porque eles trabalham com objetos
daquele coleção através de uma interface abstrata.
Aplicabilidade
• Utilize o Visitor quando você precisa fazer uma operação em todos os elementos de uma estrutura de objetos
complexa (por exemplo, uma árvore de objetos).
• Utilize o Visitor para limpar a lógica de negócio de comportamentos auxiliares.
• Utilize o padrão quando um comportamento faz sentido apenas dentro de algumas classes de uma uma hierarquia
de classe, mas não em outras.
Prós e contras
PRÓS CONTRAS
• Princípio aberto/fechado. Você pode • Você precisa atualizar todos os
introduzir um novo comportamento que visitantes a cada vez que a classe é
pode funcionar com objetos de diferentes adicionada ou removida da hierarquia
classes sem mudar essas classes. de elementos.
• Visitantes podem não ter seu acesso
• Princípio de responsabilidade única. Você permitido para campos e métodos
pode mover múltiplas versões do mesmo privados dos elementos que eles
comportamento para dentro da mesma deveriam estar trabalhando
classe.
• Um objeto visitante pode acumular
algumas informações úteis enquanto
trabalha com vários objetos. Isso pode ser
interessante quando você quer percorrer
algum objeto de estrutura complexa, tais
como um objeto árvore, e aplicar o
visitante para cada objeto da estrutura.
Observer
Compartilhamento de recursos de maneira
inteligente
Propósito
O Observer é um padrão de projeto comportamental
que permite que você defina um mecanismo de
assinatura para notificar múltiplos objetos sobre
quaisquer eventos que aconteçam com o objeto que
eles estão observando.
Problema
Imagine que você tem dois tipos de objetos: um
Cliente e uma Loja. O cliente está muito interessado
em uma marca particular de um produto (digamos que
seja um novo modelo de iPhone) que logo deverá estar
disponível na loja.