备忘录模式
# 备忘录模式
# 介绍
备忘录模式(Memento Pattern)用于随时记录一个对象的状态变化,随时可以恢复之前的某个状态(如撤销功能)。
# 通俗的示例
前端实现的一些工具比如编辑器中比较常见,其它场景用的比较少。
# 备忘录模式的通用实现
以一个编辑器为例,代码如下:
/* 状态备忘 */
class Memento {
constructor(content) {
this.content = content;
}
getContent() {
return this.content;
}
}
/* 备忘列表 */
class CareTaker {
constructor() {
this.list = [];
}
add(memento) {
this.list.push(memento);
}
get(index) {
return this.list[index];
}
}
/* 编辑器 */
class Editor {
constructor() {
this.content = null;
}
setContent(content) {
this.content = content;
}
getContent() {
return this.content;
}
saveContentToMemento() {
return new Memento(this.content);
}
getContentFromMemento(memento) {
this.content = memento.getContent();
}
}
// 测试
let editor = new Editor();
let careTaker = new CareTaker();
editor.setContent('111');
editor.setContent('222');
careTaker.add(editor.saveContentToMemento()); // 将当前内容备份
editor.setContent('333');
careTaker.add(editor.saveContentToMemento()); // 将当前内容备份
editor.setContent('444');
console.log(editor.getContent());
editor.getContentFromMemento(careTaker.get(1)); // 撤销
console.log(editor.getContent());
editor.getContentFromMemento(careTaker.get(0)); // 撤销
console.log(editor.getContent());
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# 设计原则验证
- 状态对象与使用者分开,解耦
- 符合开放封闭原则
(完)