Desenvolva um programa que armazene todas as alterações realizadas numa determinada classe, possibilitando ao usuário a recuperação dos estados anteriores caso necessário. Utilize o padrão de projeto Memento na implementação do programa.
/*************************************************************************
* Copyright (C) 2009/2025 - Cristiano Lehrer (cristiano@ybadoo.com.br) *
* Ybadoo - Solucoes em Software Livre (ybadoo.com.br) *
* *
* Permission is granted to copy, distribute and/or modify this document *
* under the terms of the GNU Free Documentation License, Version 1.3 or *
* any later version published by the Free Software Foundation; with no *
* Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A *
* A copy of the license is included in the section entitled "GNU Free *
* Documentation License". *
* *
* Ubuntu 16.10 (GNU/Linux 4.8.0-39-generic) *
* OpenJDK Version "1.8.0_121" *
* OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode) *
*************************************************************************/
package com.ybadoo.tutoriais.poo.tutorial10.exercicio35;
import java.io.Serializable;
/**
* Representação das informações de uma pessoa
*
* Originator - cria um memento contendo um instantâneo do seu estado
* interno corrente.
* - Usa o memento para restaurar o seu estado interno
* (Gamma, 2000).
*/
public class Person
{
/**
* Memento da classe pessoa
*
* Memento - armazena o estado interno do objeto Originator. O memento
* pode armazenar pouco ou muito do estado interno do Originator,
* conforme necessário e segundo critérios do seu originador.
* - protege contra acesso por objetos que não o Originator.
* Mementos têm efetivamente duas interfaces. O Caretaker vê uma
* interface estreita do memento - ele somente pode passar o
* memento para outros objetos. O originador, diferentemente, vê
* uma interface larga, que lhe permite acessar todos os dados
* necessários para se retaurar ao seu estado prévio. Idealmente,
* somente o originador que produziu o memento teria o acesso
* permitido ao estado interno do memento (Gamma, 2000).
*/
private class PersonMemento implements Serializable
{
/**
* Identificador de serialização da classe
*/
private static final long serialVersionUID = 1L;
/**
* Endereço da pessoa
*/
private String address;
/**
* Celular da pessoa
*/
private Long cellphone;
/**
* Nome da pessoa
*/
private String name;
}
/**
* Endereço da pessoa
*/
private String address;
/**
* Celular da pessoa
*/
private Long cellphone;
/**
* Nome da pessoa
*/
private String name;
/**
* Inicializar a pessoa
*
* @param name nome da pessoa
*/
public Person(String name)
{
this.name = name;
}
/**
* Retornar o endereço da pessoa
*
* @return endereço da pessoa
*/
public String getAddress()
{
return address;
}
/**
* Retornar o celular da pessoa
*
* @return celular da pessoa
*/
public Long getCellphone()
{
return cellphone;
}
/**
* Retornar o nome da pessoa
*
* @return nome da pessoa
*/
public String getName()
{
return name;
}
/**
* Restaurar o estado da classe do memento
*
* @param memento estado da classe
*/
public void restore(Object memento)
{
if(memento instanceof PersonMemento)
{
PersonMemento personMemento = (PersonMemento) memento;
name = personMemento.name;
address = personMemento.address;
cellphone = personMemento.cellphone;
}
}
/**
* Salvar o estado no memento
*
* @return memento contendo o estado da classe
*/
public Object save()
{
PersonMemento personMemento = new PersonMemento();
personMemento.name = name;
personMemento.address = address;
personMemento.cellphone = cellphone;
return personMemento;
}
/**
* Configurar o endereço da pessoa
*
* @param address endereço da pessoa
*/
public void setAddress(String address)
{
this.address = address;
}
/**
* Configurar o celular da pessoa
*
* @param cellphone celular na pessoa
*/
public void setCellphone(Long cellphone)
{
this.cellphone = cellphone;
}
/**
* Configurar o nome da pessoa
*
* @param name nome da pessoa
*/
public void setName(String name)
{
this.name = name;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString()
{
return "Name: " + name + "\n" +
"Address: " + address + "\n" +
"Cellphone: " + cellphone;
}
}
/*************************************************************************
* Copyright (C) 2009/2025 - Cristiano Lehrer (cristiano@ybadoo.com.br) *
* Ybadoo - Solucoes em Software Livre (ybadoo.com.br) *
* *
* Permission is granted to copy, distribute and/or modify this document *
* under the terms of the GNU Free Documentation License, Version 1.3 or *
* any later version published by the Free Software Foundation; with no *
* Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A *
* A copy of the license is included in the section entitled "GNU Free *
* Documentation License". *
* *
* Ubuntu 16.10 (GNU/Linux 4.8.0-39-generic) *
* OpenJDK Version "1.8.0_121" *
* OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode) *
*************************************************************************/
package com.ybadoo.tutoriais.poo.tutorial10.exercicio35;
import java.util.Stack;
/**
* Histórico de alterações realizadas na classe Pessoa
*
* Caretaker - é responsável pela custódia do memento.
* - nunca opera ou examina os conteúdos de um memento
* (Gamma, 2000).
*/
public class History
{
/**
* Pilha contendo o histórico de alterações da classe
*/
private Stack<Object> stack;
/**
* Inicializar o histórico de alterações
*/
public History()
{
stack = new Stack<>();
}
/**
* Recuperar o estado no topo da pilha
*
* @return estado no topo da pilha
*/
public Object peek()
{
return stack.peek();
}
/**
* Retirar o estado no topo da pilha
*
* @return estado no topo da pilha
*/
public Object pop()
{
return stack.pop();
}
/**
* Salvar um estado no histórico
*
* @param memento estado da classe
*/
public void push(Object memento)
{
stack.push(memento);
}
}
/*************************************************************************
* Copyright (C) 2009/2025 - Cristiano Lehrer (cristiano@ybadoo.com.br) *
* Ybadoo - Solucoes em Software Livre (ybadoo.com.br) *
* *
* Permission is granted to copy, distribute and/or modify this document *
* under the terms of the GNU Free Documentation License, Version 1.3 or *
* any later version published by the Free Software Foundation; with no *
* Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A *
* A copy of the license is included in the section entitled "GNU Free *
* Documentation License". *
* *
* Ubuntu 16.10 (GNU/Linux 4.8.0-39-generic) *
* OpenJDK Version "1.8.0_121" *
* OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode) *
*************************************************************************/
package com.ybadoo.tutoriais.poo.tutorial10.exercicio35;
/**
* Classe responsável pela execução do padrão Memento
*/
public class Application
{
/**
* Construtor para inicializar a execução do padrão Memento
*/
private Application()
{
}
/**
* Método principal da linguagem de programação Java
*
* @param args argumentos da linha de comando (não utilizado)
*/
public static void main(String[] args)
{
History history = new History();
Person person = new Person("Fulano da Silva");
person.setAddress("Rua São Luís, 245");
person.setCellphone(61999991234L);
System.out.println(person);
history.push(person.save());
person.setAddress("Rua Marechal Deodoro, 1867");
System.out.println(person);
person.restore(history.pop());
System.out.println(person);
}
}