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)。