Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Different ways to implement the Memento Pattern in Java

I am doing some research into the Memento Pattern and it seems that most of the examples I have come across seem to be relatively similar (Saving a String into an array and restoring it when needed) now correct me if I am wrong but I believe the method that i just described is "Object Cloning" but what are the other ways of implementing the Memento Pattern?

From what I have also picked up on Serialization can be used but there seems to be a grey area with people saying that it violates the encapsulation of the object and isn't a way to implement to Memento Pattern due to this.

So will anybody be able to shed some light on the ways to implement the pattern? My research has came up with a sort of mixture of all different things and has just made everything confusing.

Thanks

like image 622
Mr. Espresso Avatar asked Sep 23 '26 15:09

Mr. Espresso


1 Answers

The Java Collections framework defines Queue, which can help.

Candidate code:

public final class Memento<T>
{
    // List of saved values
    private final Queue<T> queue = new ArrayDeque<T>();

    // Last entered value, whether it has been saved or not
    private T currentValue;

    // No initial state, ie currentValue will be null on construction, hence
    // no constructor

    // Set a value, don't save it
    public void set(final T value)
    {
        currentValue = value;
    }

    // Persist the currently saved value
    public void persist()
    {
        queue.add(currentValue);
    }

    // Return the last saved value
    public T lastSaved()
    {
        return queue.element();
    }

    // Return the last entered value
    public T lastEntered()
    {
        return currentValue;
    }
}

Notably missing from this code are many things, but are easily implementable:

  • revert to the last saved value;
  • no check for nulls;
  • T does not implement Serializable;
  • convenience method (like, add a value and make it the last saved state);
  • code is not thread safe!

Etc.

Sample code:

public static void main(final String... args)
{
    final Memento<String> memento = new Memento<String>();

    memento.set("state1");
    System.out.println(memento.lastEntered()); // "state1"
    memento.persist();
    memento.set("state2");
    System.out.println(memento.lastEntered()); // "state2"
    System.out.println(memento.lastSaved()); // "state1"
}

In effect: this is a braindead implementation which can be improved, but which can be used as a basis -- extending it depends on your needs ;)

like image 91
fge Avatar answered Sep 25 '26 05:09

fge



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!