设计模式之备忘录模式

设计模式之备忘录模式

备忘录模式

定义:备忘录模式用于在不破坏封装的前提下,捕获对象的状态并在以后恢复。它提供了一种数据快照的机制,使得对象可以回滚到某个历史状态,常用于撤销(Undo)操作。

核心角色

1.发起人(Originator)

  • 负责创建备忘录,并存储当前状态。
  • 可以根据备忘录恢复先前的状态。

2.备忘录(Memento)

  • 存储发起人的内部状态。
  • 保护发起人的状态不被外界修改(通常是不可变的)。

3.管理者(Caretaker)

  • 负责保存和恢复备忘录。
  • 不会修改备忘录的内容,只用于存储和提供给Originator进行恢复。

示例代码(Java实现)

1️⃣ 备忘录(Memento)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* 备忘录:存储状态
*
* @author Mr.Zxb
* @description
* @date 2025/03/01 19:46
*/
public class Memento {
/**
* 状态
*/
private final String state;

public Memento(String state) {
this.state = state;
}

public String getState() {
return state;
}
}

2️⃣ 发起人(Originator)

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
/**
* 发起人:创建和恢复备忘录
* @author Mr.Zxb
* @description
* @date 2025/03/01 19:48
*/
public class Originator {
private String state;

public void setState(String state) {
this.state = state;
System.out.println("当前状态: " + state);
}

/**
* 保存状态
* @return
*/
public Memento saveStateToMemento() {
return new Memento(state);
}

/**
* 恢复备忘录
* @param memento
*/
public void restoreFromMemento(Memento memento) {
this.state = memento.getState();
System.out.println("状态恢复为:" + state);
}

@Override
public String toString() {
return "Originator{" +
"state='" + state + '\'' +
'}';
}
}

3️⃣ 管理者(Caretaker)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.ArrayList;
import java.util.List;

/**
* 管理者:存储多个备忘录
* @author Mr.Zxb
* @description
* @date 2025/03/01 19:53
*/
public class Caretaker {
private final List<Memento> history = new ArrayList<>();

public void addMemento(Memento memento) {
history.add(memento);
}

public Memento getMemento(int index) {
return history.get(index);
}
}

创建测试类

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
/**
* 测试类
* @author Mr.Zxb
* @description
* @date 2025/03/01 19:54
*/
public class MementoPatternDemo {
public static void main(String[] args) {
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();

originator.setState("状态1");
caretaker.addMemento(originator.saveStateToMemento());

originator.setState("状态2");
caretaker.addMemento(originator.saveStateToMemento());

originator.setState("状态3");
caretaker.addMemento(originator.saveStateToMemento());
System.out.println("当前状态:" + originator);

// 恢复到之前的状态
// 恢复到状态1
originator.restoreFromMemento(caretaker.getMemento(0));
}
}

输出结果

1
2
3
4
5
当前状态: 状态1
当前状态: 状态2
当前状态: 状态3
当前状态:Originator{state='状态3'}
状态恢复为:状态1

应用场景

  • 文本编辑器的撤销功能(Word、记事本)
  • 游戏存档(保存和恢复游戏进度)
  • 事务管理(数据库事务回滚)
  • IDE代码撤销/恢复(Ctrl+Z & Ctrl+Y)

总结

  1. 备忘录模式用于保存对象的历史状态,便于后续恢复。
  2. 适用于撤销、恢复、存档等功能,但需要注意内存消耗。
  3. 三大角色(发起人、备忘录、管理者)各司其职,保证封装性。