Ybadoo - Soluções em Software Livre
Tutoriais
Programação Orientada a Objetos

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.

 

Diagrama de Classes na Linguagem de Programação Java Person.java History.java Application.java
Diagrama de Classes
Diagrama de Classes na Linguagem de Programação Java

Arquivo Person.java

/*************************************************************************
 * Copyright (C) 2009/2024 - 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;
  }
}

Arquivo History.java

/*************************************************************************
 * Copyright (C) 2009/2024 - 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);
  }
}

Arquivo Application.java

/*************************************************************************
 * Copyright (C) 2009/2024 - 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);
  }
}
Gamma, Erich. (2000). Padrões de Projeto: soluções reutilizáveis de software orientado a objetos. Porto Alegre: Bookman. 364 páginas.