备忘录(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。
Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录Memento。备忘录有两个接口,Caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator能够看到一个宽接口,它允许访问返回到先前状态所需要的所有数据。
Caretaker(管理者):负责保存好备忘录Memento,不能对备忘录的对象进行操作或检查。
设计备忘录三大步骤:
1、 设计备忘录的节点,存储记录。
2、 设计记录的存储,即集合Caretaker。
3、 操作记录的类,记录节点状态,设置节点状态,显示状态。
Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录Memento。备忘录有两个接口,Caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator能够看到一个宽接口,它允许访问返回到先前状态所需要的所有数据。
Caretaker(管理者):负责保存好备忘录Memento,不能对备忘录的对象进行操作或检查。
设计备忘录三大步骤:
1、 设计备忘录的节点,存储记录。
2、 设计记录的存储,即集合Caretaker。
3、 操作记录的类,记录节点状态,设置节点状态,显示状态。
应用场景:需要回放的软件,记录事物的状态,数据库备份,文档的编译,撤销,恢复。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Memo
{
public:
string state;
Memo(string state) //记录当前的状态,
{
this->state = state;
}
};
class Originator//发起人
{
public:
string state;
void setMemo(Memo *memo)//发起人
{
state = memo->state;
}
Memo *createMemo()
{
return new Memo(state);
}
void show()
{
cout << state << endl;
}
};
//备忘录的集合
class Caretaker
{
public:
vector<Memo *> memo;
void save(Memo *memo)
{
(this->memo).push_back(memo);
}
Memo *getState(int i)
{
return memo[i];
}
};
int main()
{
Originator *og = new Originator();
Caretaker *ct = new Caretaker();
og->state = "on";
og->show();
ct->save(og->createMemo());
og->state = "off";
og->show();
ct->save(og->createMemo());
og->state = "middle";
og->show();
ct->save(og->createMemo());
og->setMemo(ct->getState(1));
og->show();
og->setMemo(ct->getState(2));
og->show();
delete og;
delete ct;
return 0;
}