Memento - Unisinos

Transcrição

Memento - Unisinos
Behavioral
Behavioral Patterns
Patterns -- Memento
Memento
Prover mecanismo para que se possa retornar a
um estado anterior de um objeto.
Associado a idéia de recuperação de dados ou
de estado.
Mecanismo de check-point
Mecanismo de undo
O objetivo é manter no próprio objeto uma
cópia do seu estado anterior, de tal forma que
não se perca o encapsulamento dos dados.
4-jun-09
Leandro Tonietto
221
Behavioral
Behavioral Patterns
Patterns -- Memento
Memento
Exemplo em [1]:
Software de edição de elementos gráficos.
Software suporta undo.
Uma possibilidade seria fazer uma ação contrária (função inversa)
da última ação realizada:
Fazer um deslocamento de um objeto e desfazer o deslocamento
(p.e. distância negativa) para voltar a posição anterior, não garante
a visualização correta dos elementos, assim como estavam
anteriormente (figura abaixo).
Ao invés de desfazer o deslocamento como uma função inversa é
mais eficiente guardar o estado anterior dos objetos e retornar a
este estado.
Somente quem originou uma mudança pode desfazê-la.
4-jun-09
Leandro Tonietto
222
Behavioral
Behavioral Patterns
Patterns -- Memento
Memento
Estrutura básica:
Memento: objeto que armazena um estado
Originator: cria um memento para armazenar seu estado anterior
Caretaker: executa mecanismo de undo.
4-jun-09
Leandro Tonietto
223
Behavioral
Behavioral Patterns
Patterns -- Memento
Memento
Estrutura básica:
4-jun-09
Leandro Tonietto
224
Behavioral
Behavioral Patterns
Patterns -- Memento
Memento
Aplicação:
Quando é necessário manter cópia do
estado anterior de objetos da aplicação (ou
parte deles) para se voltar a estados
anteriores.
4-jun-09
Leandro Tonietto
225
Behavioral
Behavioral Patterns
Patterns -- Memento
Memento
Conseqüência:
Evita expor propriedades de um objeto para guardar seu valor
anterior.
Simplifica Originator. Ele apenas aponta para o objeto que
contem a cópia dele mesmo. Não se preocupa com o
armazenamento dos estados anteriores, nem em como
gerenciar retorno aos estados anteriores.
Uso de memento pode ser caro, considerando o número de
cópias a serem mantidas. Depende da necessidade da
aplicação.
Um Caretaker não sabe quantos estados ele está gerenciando
para os mementos que ele cuida. Então, ele pode ter um
gerenciamento ineficiente, deve-se controlar a quantidade
de mementos, se for o caso ou a forma de armazenamento.
Pode ser necessário guardar cópia em disco.
Outro ponto importante é questão de cópia dos dados:
Shadow copy X deep copy
4-jun-09
Leandro Tonietto
226
Behavioral
Behavioral Patterns
Patterns -- Memento
Memento
Implementação:
Somente um objeto Originator pode obter o estado
que o objeto Memento armazena.
Em C++ é possível criar os métodos privados na classe
Memento e usar o modificador friend para dar visibilidade
aos membros privados aos objetos da classe Originator.
Mudanças incrementais. Se é necessário desfazer
muitas mudanças no estado total do objeto. É mais
interessante mudar apenas de forma incremental,
sem guardar cópias de objetos complexos.
Por exemplo, se um software de tratamento de imagens
que permite mudar apenas parte dos pontos de uma
imagens. Neste caso, não há necessidade de se guardar
todos os pontos da imagem como um memento, é
possível guardar apenas os pixels modificados.
4-jun-09
Leandro Tonietto
227
Behavioral
Behavioral Patterns
Patterns -- Memento
Memento
Exemplo: Framework UndoRedo do editor de
imagens
A cada ação realizada sobre uma imagem, é
guardada um registro no histórico de ações.
Dos atributos da imagem são guardados apenas os
pixels modificados.
Quando é necessário desfazer um ação realizada
sobre a imagem, como aplicação de algum filtro,
por exemplo, o objeto Originator do Memento da
imagem recupera o estado anterior e substitui os
pixels modificados pelos pixels do memento.
4-jun-09
Leandro Tonietto
228
Behavioral
Behavioral Patterns
Patterns -- Memento
Memento
Exemplo: Framework UndoRedo do editor de imagens
4-jun-09
Leandro Tonietto
229