设计模式之备忘录模式

写在前面

本文一起看下一种行为型设计模式,备忘录模式。

1:介绍

1.1:什么时候使用备忘录设计模式

当某个对象需要记录在某个或者是某几个时刻的运行状态,并且可能在后续恢复到某个状态时,就可以考虑使用备忘录设计模式。比如,记事本每次打开都是上次的内容,或者通过ctrl+z可以回复到上一次的修改,再比如,游戏,我们可以暂停游戏,当恢复游戏之后还是可以继续,而不是从头玩。

1.2:UML类图

原型设计模式,包含如下元素:

1:Memmento
    对某时刻需要记录的信息的封装,即只是一个简单的pojo
2:Originator
    需要记录某一时刻状态的对象
3:CareTake
    负责维护Originator的Memento信息的类

2:实例

源码 。

2.1:场景

打怪游戏,暂停后,重新开始恢复到暂停前的状态。

2.2:程序

  • Memmento
public class GameProgressMemento {
    private int score;

    public GameProgressMemento(int score) {
        this.score = score;
    }

    public int getScore() {
        return score;
    }
}

这里简单起见,只定义了分数信息,实际场景中需要备忘的信息会比较多。

  • Origininator
public class GameOriginator {
    private int currentScore;

    //将需要保存的状态分装在Memento里对外提供
//    public GameProgressMemento saveProcess() {
    public GameProgressMemento fetchCurState() {
        // 这里体现了备忘录模式中的备忘录名称的来源
        System.out.println("保存分数信息");
        return new GameProgressMemento(currentScore);
    }

    //通过从外部接收的Memento恢复状态
    public void restoreProcess(GameProgressMemento memento) {
        currentScore = memento.getScore();
    }

    //对内部状态的使用
    public void playGame() {
        System.out.println("------------------开始游戏------------------");
        System.out.println("当前分数为:"+ currentScore);
        System.out.println("杀死一个小怪物得1分");
        currentScore++;
        System.out.println(String.format("总分为:%d", currentScore));
    }

    public void exitGame() {
//        this.saveProcess();
        System.out.println("退出游戏");
        currentScore=0;
        System.out.println("-----------------退出游戏-------------------");
    }
}
  • CareTaker
    负责维护Originator的状态:
public class GameCareTaker {

    private List<GameProgressMemento> memento= new ArrayList<>();

    public void saveMemento(GameProgressMemento memento) {
        this.memento.add(memento);
    }

    public GameProgressMemento getMemento(int index) {
        return this.memento.get(index);
    }
}
  • 测试
@Test
public void replayGame() {
    GameOriginator originator = new GameOriginator();
    GameCareTaker careTaker = new GameCareTaker();
    //玩游戏
    originator.playGame();
    //保存进度
//        careTaker.saveMemento(originator.saveProcess());
    careTaker.saveMemento(originator.fetchCurState());
    //退出游戏
    originator.exitGame();

    //重新打开游戏,恢复进度
    originator.restoreProcess(careTaker.getMemento(0));
    originator.playGame();
}

运行:

------------------开始游戏------------------
当前分数为:0
杀死一个小怪物得1分
总分为:1
保存分数信息
退出游戏
-----------------退出游戏-------------------
------------------开始游戏------------------
当前分数为:1
杀死一个小怪物得1分
总分为:2

写在后面

参考文章列表

秒懂设计模式之备忘录模式(Memento Pattern) 。

你可能感兴趣的:(设计模式,设计模式,备忘录模式)