设计模式之备忘录模式

设计模式之备忘录模式📕

不违反封装的情况下,捕获并外化对象的内部状态,以便稍后可以将对象恢复到此状态。

应用场景

必须保存对象状态的快照,以便以后可以将其恢复到该状态

模式结构

模式结构分为三种结构:

  1. 发起人 (Originator)
    负责创建一个有内部状态的备忘录对象。
  2. 负责人 (Caretaker)
    负责保存备忘录内容,但是不检查备忘录的内容。
  3. 备忘录 (Memento)
    保存发起人的内部的状态。

模式结构

上图中的ActionGame为负责人,负责保存状态,Player为发起人负责主动记录备忘录。

实际场景

在玩单机游戏的时候,在通过一个关卡的时候,系统会记录你当时的状态信息,如果下一关没通过,会自动还原到上一个记录点从新开始。这种情况下就可以使用备忘录模式记录存档状态,并在适当的时候还原状态。针对此处场景,使用下面代码还原。

代码

作为发起者的Player

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
public class Player {
// 游戏状态
private GameState gameState;

Player(GameState gameState) {
this.gameState = gameState;
}

// 设置状态
void setGameState(GameState gameState) {
this.gameState = gameState;
}

//获取状态
GameState getGameState() {
return gameState;
}

// 创建存档记录
Memento createMemento(){
return new Memento(gameState);
}
// 回退存档记录
void retrieveMemento(Memento memento){
this.gameState = memento.getGameState();
}

}

作为负责人的ActionGame

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
public interface Game {
void storeGamePoint(Memento memento);
Memento retrieveGamePoint();
}

public class ActionGame implements Game {

private Memento memento;
/**
* 存档记录
* @Author nanyin
* @Date 17:31 2019-06-26
* @param memento 1
* @return void
**/
@Override
public void storeGamePoint(Memento memento) {
this.memento = memento;
}
/**
* 还原记录点
* @Author nanyin
* @Date 17:32 2019-06-26
* @return Memento
**/
@Override
public Memento retrieveGamePoint() {
return this.memento;
}
}

作为备忘录的Memento

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Memento {
private GameState gameState;
Memento(GameState gameState) {
this.gameState = gameState;
}

GameState getGameState() {
return gameState;
}
}

public enum GameState {
DIE,SUCCESS
}

客户端程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class App {
public static void main(String[] args) {
//创建一个动作类型的游戏
Game actionGame = new ActionGame();
//玩家通关
Player player = new Player(GameState.SUCCESS);
//存档
Memento memento = player.createMemento();
actionGame.storeGamePoint(memento);
//此时玩家阵亡
player.setGameState(GameState.DIE);
System.out.println(player.getGameState());
//需要从上一次游戏存档中加载原来的玩家状态
player.retrieveMemento(actionGame.retrieveGamePoint());
System.out.println(player.getGameState());
}
}

在游戏存档后死亡,再重复读存档,得到之前存档之前的状态。游戏不会主动存档和读取存档,只会记录存档中的内容,而玩家会主动从游戏中读取存档,然后恢复到存档的状态。

-------------本文结束感谢您的阅读-------------

本文标题:设计模式之备忘录模式

文章作者:NanYin

发布时间:2019年06月25日 - 12:06

最后更新:2019年08月12日 - 13:08

原始链接:https://nanyiniu.github.io/2019/06/25/2019-06-25-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E4%B9%8B%E5%A4%87%E5%BF%98%E5%BD%95%E6%A8%A1%E5%BC%8F/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。