0%

设计模式之行为型模式(六):备忘录模式

1. 备忘录模式概述

  • 概念

    • 在不破坏封装的条件下,通过备忘录对象存储另外一个对象内部状态的快照,在将来合适的时候把这个对象还原到存储起来的状态
    • 例如游戏存档、IDE 设置导出成 zip 在合适时机再导入
  • 优点

    • 给用户提供了一种可以恢复状态的机制,使用户能够比较方便地回到某个历史状态
    • 实现了信息的封装,使得用户不需要关心状态的保存细节
  • 缺点

    • 消耗资源,如果累的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存
  • 配合

    • 备忘录模式可以和命令模式结合,实现“撤销”功能
    • 备忘录模式可以和迭代器模式结合,以获取当前迭代器的状态,并在需要的时候进行回滚
    • 原型模式可以作为备忘录模式的简化版本
  • Demo

    • 玩家类

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      class Player {
      // 生命值
      private int life = 100;
      // 魔法值
      private int magic = 100;

      public void fightBoss() {
      life -= 100;
      magic -= 100;
      if (life <= 0) {
      System.out.println("壮烈牺牲");
      }
      }

      public int getLife() {
      return life;
      }

      public void setLife(int life) {
      this.life = life;
      }

      public int getMagic() {
      return magic;
      }

      public void setMagic(int magic) {
      this.magic = magic;
      }
      }
    • 客户端

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      public class Client {
      @Test
      public void test() {
      Player player = new Player();
      // 存档
      int savedLife = player.getLife();
      int savedMagic = player.getMagic();

      // 打 Boss,打不过,壮烈牺牲
      player.fightBoss();

      // 读档,恢复到打 Boss 之前的状态
      player.setLife(savedLife);
      player.setMagic(savedMagic);
      }
      }
    • 备忘录类:将存档、读档交给需要存档的类内部去实现

      1
      2
      3
      4
      5
      6
      7
      8
      9
      class Memento {
      int life;
      int magic;

      Memento(int life, int magic) {
      this.life = life;
      this.magic = magic;
      }
      }
    • 玩家类:通过备忘录类实现存档、读档

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      class Player {
      ...

      // 存档
      public Memento saveState() {
      return new Memento(life, magic);
      }

      // 读档
      public void restoreState(Memento memento) {
      this.life = memento.life;
      this.magic = memento.magic;
      }
      }
    • 修改客户端

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      public class Client {
      @Test
      public void test() {
      Player player = new Player();
      // 存档
      Memento memento = player.saveState();

      // 打 Boss,打不过,壮烈牺牲
      player.fightBoss();

      // 读档
      player.restoreState(memento);
      }
      }
-------------------- 本文结束感谢您的阅读 --------------------