个人博客

http://www.milovetingting.cn

备忘录模式

模式介绍

备忘录是一种行为模式,用于保存对象当前状态,并且在之后可以再次恢复到此状态。备忘录模式实现的方式需要保证被保存的对象不能从外部访问,目的是为了保护好保存的这些对象状态的完整性以及内部实现不向外部暴露。

模式定义

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

使用场景

  1. 需要保存一个对象在某一个时刻的状态或部分状态。

  2. 如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不希望外界直接访问其内部状态,通过中间对象可以间接访问其内部状态。

简单使用

定义备忘录

1
2
3
4
5
6
7
8
9
10
public class Memo {
public int checkPoint;
public int lifeValue;

@Override
public String toString() {
return "Memo [checkPoint=" + checkPoint + ", lifeValue=" + lifeValue + "]";
}

}

定义管理器

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Manager {

Memo memo;

public void save(Memo memo) {
this.memo = memo;
}

public Memo getMemo() {
return memo;
}

}

定义游戏

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
31
32
33
34
35
36
37
38
39
40
public class Game {

private int mCheckPoint = 1;

private int mLifeValue = 100;

public void play() {
System.out.println("玩游戏:" + String.format("第%d关", mCheckPoint));
mLifeValue -= 10;
System.out.println("进入下一关");
mCheckPoint++;
System.out.println(String.format("到达%d关", mCheckPoint));
}

public void exit() {
System.out.println("-------------------");
System.out.println("退出游戏前属性:" + this.toString());
System.out.println("退出游戏");
System.out.println("-------------------");
}

public Memo createMemo() {
Memo memo = new Memo();
memo.checkPoint = mCheckPoint;
memo.lifeValue = mLifeValue;
return memo;
}

public void restore(Memo memo) {
mCheckPoint = memo.checkPoint;
mLifeValue = memo.lifeValue;
System.out.println("恢复后的游戏属性:" + this.toString());
}

@Override
public String toString() {
return "Game [mCheckPoint=" + mCheckPoint + ", mLifeValue=" + mLifeValue + "]";
}

}

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Main {

public static void main(String[] args) {
Game game = new Game();
//打游戏
game.play();
Manager manager = new Manager();
//存档
manager.save(game.createMemo());
//退出游戏
game.exit();
//恢复游戏
Game newGame = new Game();
newGame.restore(manager.getMemo());
}

}

输出结果

1
2
3
4
5
6
7
8
玩游戏:第1关
进入下一关
到达2关
-------------------
退出游戏前属性:Game [mCheckPoint=2, mLifeValue=90]
退出游戏
-------------------
恢复后的游戏属性:Game [mCheckPoint=2, mLifeValue=90]

小结

备忘录模式是在不破坏封装的条件下,通过备忘录对象存储另外一个对象内部的快照,在将来合适的时候把这个对象还原到存储起来的状态。

优点

给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。

实现了信息的封装,使用用户不需要关心状态的保存细节。

缺点

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