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