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
30class 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
16public 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
9class 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
14class 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
14public class Client {
public void test() {
Player player = new Player();
// 存档
Memento memento = player.saveState();
// 打 Boss,打不过,壮烈牺牲
player.fightBoss();
// 读档
player.restoreState(memento);
}
}