备忘录模式
- 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象回复到原先保存的状态
- 将要保存的细节封装到备忘录(Memento)中,更改保存的细节不影响客户端
- 适用于功能比较复杂,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分
#include <iostream>
#include <string>
using namespace std;
class Originator;
//备忘录
class Memento
{
public:
Memento(string _stateA, string _stateB)
:stateA(_stateA), stateB(_stateB)
{}
string UseMemStateA()
{
return stateA;
}
string UseMemStateB()
{
return stateB;
}
~Memento() {}
private:
string stateA;
string stateB;
};
//发起人
class Originator
{
public:
Originator(string s1, string s2, string s3)
:stateA(s1), stateB(s2), stateC(s3)
{}
~Originator() {}
Memento* CreateMemento()
{
return new Memento(stateA, stateB);
}
void SetState(string s)
{
stateA = s;
stateB = s;
stateC = s;
}
void SetMemento(Memento &mem)
{
stateA = mem.UseMemStateA();
stateB = mem.UseMemStateB();
}
void ShowState()
{
cout << stateA << endl;
cout << stateB << endl;
cout << stateC << endl;
}
private:
string stateA;
string stateB;
string stateC;
};
//管理者
class Caretaker
{
public:
Caretaker()
{
mem = NULL;
}
~Caretaker()
{
if (mem != NULL)
delete mem;
}
Memento* GetMemento()
{
return mem;
}
Memento *mem;
};
int main()
{
//初始状态
Originator* o = new Originator("AA", "BB", "CC");
o->ShowState();
cout << "----------" << endl;
//创建管理者,管理备忘录
Caretaker* c = new Caretaker;
c->mem = o->CreateMemento();
//改变状态
o->SetState("err");
o->ShowState();
cout << "----------" << endl;
//恢复需要恢复的部分
o->SetMemento(*c->mem);
o->ShowState();
getchar();
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/450bc1e2c0aa807352dd8dedc59e710a.png)