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 #include #include 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.1Originator通过Mememto来保存真实的内部状态,不保留历史状态(3.2)。

6.2Caretaker持有有历史状态的Mememto指针,但不关注其内部状态(3.1)。