> For the complete documentation index, see [llms.txt](https://ondrej-kvasnovsky-2.gitbook.io/design-patterns-handbook/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ondrej-kvasnovsky-2.gitbook.io/design-patterns-handbook/behavioral-patterns/memento.md).

# Memento

Memento patter helps us to persist state of application in given time, so we can easily roll back or traverse through history of changes.

## Example - Save game progress

We are going to use memento pattern to save game whenever user reaches a checkpoint.

```
class Game {
    private Checkpoint checkpoint;

    public void setCheckpoint(Checkpoint checkpoint) {
        this.checkpoint = checkpoint;
    }
}

class Checkpoint implements Cloneable {

    private int exp;

    public Checkpoint(int exp) {
        this.exp = exp;
    }

    public Checkpoint clone() {
        return new Checkpoint(exp);
    }
}

class GameProgressKeeper {

    private List<Checkpoint> checkpoints = new ArrayList<>();

    public void save(Checkpoint checkpoint) {
        checkpoints.add(checkpoint.clone());
    }

    public Checkpoint getLastOne() {
        return checkpoints.get(checkpoints.size() - 1);
    }
}
```

Here is how game could be played and what would have to happen in order to persist or roll back game state.

```
Game game = new Game();

// playing game... until the player reaches the first checkpoint
Checkpoint checkpoint1 = new Checkpoint(100); // other values...
game.setCheckpoint(checkpoint1);

GameProgressKeeper progressKeeper = new GameProgressKeeper();
progressKeeper.save(checkpoint1);

// continue playing game... until the player reaches the second checkpoint
// but the player died, roll back the game to the last saved checkpoint
progressKeeper.getLastOne();
game.setCheckpoint(checkpoint1);
```
