设计模式笔记:备忘录模式

备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不暴露对象实现细节的情况下保存和恢复对象内部状态。该模式通常包括三个角色:发起者(Originator)、管理者(Caretaker)和备忘录(Memento)。

以下是一个简单的 C++ 示例,演示如何使用备忘录模式来保存和恢复具有两个内部状态的对象。

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <iostream>
#include <string>
#include <vector>
#include <memory>

// 备忘录类,用于存储发起者的内部状态
class Memento {
public:
Memento(int state1, int state2) : state1_(state1), state2_(state2) {}

// 获取状态(通常这些方法是私有的,但为了简单起见,我们设为公有)
int getState1() const { return state1_; }
int getState2() const { return state2_; }

private:
int state1_;
int state2_;
};

// 发起者类,创建备忘录并恢复状态
class Originator {
public:
Originator() : state1_(0), state2_(0) {}

// 设置状态
void setState(int state1, int state2) {
state1_ = state1;
state2_ = state2;
}

// 获取当前状态(为了演示)
void showState() const {
std::cout << "State1: " << state1_ << ", State2: " << state2_ << std::endl;
}

// 创建备忘录
std::unique_ptr<Memento> createMemento() const {
return std::make_unique<Memento>(state1_, state2_);
}

// 从备忘录恢复状态
void restoreMemento(const std::unique_ptr<Memento>& memento) {
state1_ = memento->getState1();
state2_ = memento->getState2();
}

private:
int state1_;
int state2_;
};

// 管理者类,负责保存和恢复备忘录
class Caretaker {
public:
void setMemento(const std::unique_ptr<Memento>& memento) {
memento_ = memento;
}

std::unique_ptr<Memento> getMemento() const {
return memento_;
}

private:
std::unique_ptr<Memento> memento_;
};

int main() {
Originator originator;

// 设置初始状态
originator.setState(10, 20);
std::cout << "Initial state:" << std::endl;
originator.showState();

// 创建备忘录
Caretaker caretaker;
caretaker.setMemento(originator.createMemento());

// 改变状态
originator.setState(30, 40);
std::cout << "State after changes:" << std::endl;
originator.showState();

// 从备忘录恢复状态
originator.restoreMemento(caretaker.getMemento());
std::cout << "State after restoration:" << std::endl;
originator.showState();

return 0;
}

代码解释

  1. Memento 类:用于存储 Originator 对象的内部状态(state1state2)。

  2. Originator 类:

    • 持有状态(state1_state2_)。
    • 提供 setState 方法来设置状态。
    • 提供 showState 方法来显示当前状态。
    • 提供 createMemento 方法来创建当前状态的备忘录。
    • 提供 restoreMemento 方法来从备忘录恢复状态。
  3. Caretaker 类:

    • 用于保存和恢复备忘录。
    • 提供 setMemento 方法来保存备忘录。
    • 提供 getMemento 方法来获取备忘录。
  4. main 函数:

    • 创建一个 Originator 对象并设置初始状态。
    • 创建一个 Caretaker 对象并保存备忘录。
    • 修改 Originator 对象的状态。
    • Caretaker 对象恢复备忘录。

这个示例展示了如何使用备忘录模式来保存和恢复对象的内部状态,同时保持对象的封装性和完整性。