Java 设计模式——备忘录模式

模式定义

备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。

所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。通常需要一个备忘录类来存储对象状态,然后还有一个类来管理存储的对象状态,以便在需要的时候对对象进行恢复。

模式示例

下面来看具体示例,备忘录主要有三个角色:备忘录对象,要备忘的目标对象,备忘录管理。首先看备忘录对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* 备忘录类,保存了一个状态,同时还有保存的日期,根据日期可以来检索保存的备忘
*/
public class Backup {
private String state;
private Date date;

public Backup(String state) {
this.state = state;
date = new Date();
}

public String getState() {
return state;
}

public void setState(String state) {
this.state = state;
}

public Date getDate() {
return date;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 备忘录管理对象,可以读取或者添加备忘录
*/
public class Recovery {
private List<Backup> backups = new ArrayList<Backup>();

public void add(Backup backup) {
backups.add(backup);
}

public Backup retrieve(Date date) {
for (Backup backup : backups) {
if (backup.getDate().equals(date)) {
backups.remove(backup);
return backup;
}
}
return null;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* 需要备忘的对象
*/
public class Application {
private String state = "default setting";

public Backup backup() {
return new Backup(state);
}

public void recover(Backup backup) {
this.state = backup.getState();
}

public void setState(String state) {
this.state = state;
}

public String getState() {
return state;
}
}

客户端调用

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

public static void main(String[] args) {
Application application = new Application();
Recovery recovery = new Recovery();

System.out.println(application.getState());

Backup backup = application.backup(); // 建立备忘
recovery.add(backup); // 加入备忘录

application.setState("customer setting");
System.out.println(application.getState());

Date date = backup.getDate(); // 假设 date 是使用者自行设定所要取得的还原时间!
application.recover(recovery.retrieve(date)); // 取出备忘录来还原
System.out.println(application.getState());
}

}
1
2
3
default setting
customer setting
default setting

模式总结

备忘录模式的核心思想就是在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便在需要的时候可以从保存的状态中恢复。

优缺点

  • 优点
    1. 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
    2. 实现了信息的封装,使得用户不需要关心状态的保存细节。
  • 缺点
    1. 消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

使用场景

通常使用在需要保存/恢复数据的相关状态场景,在保存状态后,还提供一个可回滚的操作。也就是需要实现存档和读档这两个过程。

  • 游戏存档非常适合使用备忘录模式
  • 撤销操作
  • 数据库事务管理

注意事项

  1. 为了符合迪米特原则,还要增加一个管理备忘录的类。
  2. 为了节约内存,可使用原型模式+备忘录模式