1. 意图
在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
这样以后可以将该对象恢复到原先保存的状态。
2. 三种角色
原发器(Originator)、备忘录(Memento)、负责人(Caretaker)
3. 优点
3.1 保持了封装边界。屏蔽了原发器的内部信息。
3.2 简化了原发器。
4. 缺点
4.1 可能代价很高。
当生成备忘录必须拷贝并存储大量信息时,或非常频繁地创建备忘录和恢复原发器状态。
4.2 在一些语言中可能难于保证只有原发器可访问备忘录的状态。
4.3 维护备忘录的潜在代价。可能产生大量的存储开销。
5. 相关模式
5.1 命令模式可使用备忘录来为可撤销的操作维护状态。
5.2 备忘录可用于迭代器存储状态。
6. 代码示意(C++)
#pragma once
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Mememto
{
string m_state;
public:
Mememto(const string& state) {
m_state = state;
}
string GetState() {
return m_state;
}
void SetState(const string& state) {
m_state = state;
}
};
class Originator
{
string m_state;
public:
Mememto* CreateMememto() {
return new Mememto(m_state);
}
void SetMememto(Mememto* pMememto) {
m_state = pMememto->GetState();
}
void SetState(const string& state) {
m_state = state;
}
void ShowState() {
cout << "state:" << m_state << endl;
}
};
class CareTaker
{
Mememto* m_pMememto;
public:
CareTaker(Mememto* pMememto) {
m_pMememto = pMememto;
}
~CareTaker() {
delete m_pMememto;
}
Mememto* GetMememto() {
return m_pMememto;
}
};
#include "Mememto.h"
int main() {
Originator* pOriginator = new Originator();
pOriginator->SetState("on");
pOriginator->ShowState();
CareTaker taker(pOriginator->CreateMememto());
pOriginator->SetState("off");
pOriginator->ShowState();
pOriginator->SetMememto(taker.GetMememto());
pOriginator->ShowState();
delete pOriginator;
return 0;
}
运行结果:
6.1 Originator通过Mememto来保存真实的内部状态,不保留历史状态(3.2)。
6.2 Caretaker持有有历史状态的Mememto指针,但不关注其内部状态(3.1)。