Carregar apresentação
A apresentação está carregando. Por favor, espere
1
Kleinner Farias e Raphael do Vale
Padrão de Projeto Memento Kleinner Farias e Raphael do Vale © LES/PUC-Rio
2
Agenda Intenção Motivação Aplicabilidade Estrutura Participantes
Conseqüências Implementação Exemplo © LES/PUC-Rio
3
Intenção Sem violar o encapsulamento, capturar e externalizar um estado interno de um objeto, de maneira que o objeto possa ser restaurando para este estado mais tarde. © LES/PUC-Rio
4
Motivação Algumas vezes é necessário registrar o estado interno de um objeto. Implementação de mecanismos de checkpoints e de desfazer que permitem aos usuários retroceder de operações ou recuperar-se de erros. Trata-se de um objeto que armazena uma “instância” do estado interno de um objeto. © LES/PUC-Rio
5
Aplicabilidade Usado quando o estado de um objeto deve ser salvo de maneira que possa ser restaurado mais adiante. O uso de interface para o obtenção do estado de um objeto expõe detalhes da implementação que rompe o princípio de encapsulamento de OO. © LES/PUC-Rio
6
Estrutura © LES/PUC-Rio
7
Participantes Memento Originador Caretaker
Armazena o estado interno do objeto; Protege contra acesso por objetos que não o originador. Originador Cria um memento contendo uma “instância” do estado interno corrente; Usa o memento para restaurar o seu estado interno; Caretaker É responsável pela custódia do memento; Nunca opera ou examina os conteúdos de um memento. © LES/PUC-Rio
8
Conseqüências Preservação das fronteiras de encapsulamento
O padrão evita a exposição de informação que somente um originador deveria administrar. Ele simplifica o originador Coloca a carga de administração do armazenamento fora do Originador. O uso de mementos pode ser computacionalmente caro Se o Originador tiver que copiar grandes quantidades de informação para armazenar no memento. Ou se os clientes criam e devolvem mementos para o Originador com freqüência. © LES/PUC-Rio
9
Implementação class Originator { class Caretaker {
private String state; public void set(String state) { this.state = state; } public Object saveToMemento() { return new Memento(state); public void restoreFromMemento(Object m) { if (m instanceof Memento) { Memento memento = (Memento)m; state = memento.getSavedState(); private static class Memento { public Memento(String stateToSave) { state = stateToSave; public String getSavedState() { return state; class Caretaker { private List savedStates = new ArrayList(); public void addMemento(Object m) { savedStates.add(m); } public Object getMemento(int index) { return savedStates.get(index); © LES/PUC-Rio
10
Implementação Armazenando mudanças incrementais Proteção dos dados
Quando mementos são criados e passados de volta para o seu originador, em uma seqüência previsível, um Memento pode salvar somente a mudança incremental do estado interno do originador. Proteção dos dados É importante impor métodos de proteger os dados do memento. Somente o originador pode modificar ou obter os dados internos de um memento. © LES/PUC-Rio
11
Exemplo Controle de alterações de registros importantes
Utilizando o padrão Memento, é possível guardar versões de registros importantes a cada modificação. Para cada usuário que modificar o registro, podemos armazenar em uma espécie de log o memento do registro e o usuário que o alterou. Assim é possível ter uma auditoria, verificando todas alterações feitas pelos usuários e permitindo “voltar atrás”. © LES/PUC-Rio
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.