在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便恢复到原先保存的状态。

    【角色】

    • 创建备忘录角色(Originator):负责创建一个备忘录,可以记录、恢复自身的内部状态。
    • 备忘录角色(Memento):用于存储Originator的内部状态,并且可以防止Originator以外的对象访问Mement。
    • 存储备忘录角色(Caretaker): 负责存储备忘录,不能对备忘录的内容进行操作和访问,只能够将备忘录传递给其他对象。

      1. /**
      2. * 存档(备忘录角色)
      3. */
      4. public class Memento {
      5. // 关卡
      6. private int level;
      7. public int getLevel() {
      8. return level;
      9. }
      10. public void setLevel(int level) {
      11. this.level = level;
      12. }
      13. public Memento(int level) {
      14. this.level = level;
      15. }
      16. }
      1. /**
      2. * 游戏类(创建备忘录角色)
      3. */
      4. public class Game {
      5. // 关卡
      6. private int level;
      7. /**
      8. * 玩游戏
      9. */
      10. public void play () {
      11. System.out.println("恭喜你,通过第" + (++level) + "关" );
      12. }
      13. /**
      14. * 游戏存档
      15. */
      16. public Memento save() {
      17. return new Memento(level);
      18. }
      19. /**
      20. * 恢复游戏
      21. * @param memento
      22. */
      23. public void restore(Memento memento) {
      24. this.level = memento.getLevel();
      25. System.out.println("恢复游戏,当前是第" + this.level + "关");
      26. }
      27. }
      1. /**
      2. * 负责管理备忘者类
      3. */
      4. public class Caretaker {
      5. private Memento memento;
      6. /**
      7. * 存档
      8. */
      9. public void archive(Memento memento) {
      10. System.out.println("存档。。。");
      11. this.memento = memento;
      12. }
      13. /**
      14. * 获取存档
      15. */
      16. public Memento getMemento() {
      17. return this.memento;
      18. }
      19. }
      1. public class MementoTest {
      2. public static void main(String[] args) {
      3. // 存档管理类
      4. Caretaker caretaker = new Caretaker();
      5. // 打开游戏
      6. Game game = new Game();
      7. // 玩了第1关
      8. game.play();
      9. // 存档
      10. caretaker.archive(game.save());
      11. // 玩了第2关
      12. game.play();
      13. // 存档
      14. caretaker.archive(game.save());
      15. // 读档恢复游戏
      16. game.restore(caretaker.getMemento());
      17. }
      18. }
      19. ----输出----
      20. 恭喜你,通过第1
      21. 存档。。。
      22. 恭喜你,通过第2
      23. 存档。。。
      24. 恢复游戏,当前是第2