18、备忘录模式(Memento)
使用场景:
a) 需要保存/恢复数据相关状态场景。
b) 提供一个可回滚的操作
优点:
a) 给用户提供了一种可以恢复或回到特定历史状态的机制
b) 实现了信息的封装,使得用户不需要关心状态的保存细节
缺点:
资源消耗大。如果要保存的内部状态信息过多或者特别频繁,将会占用比较大的内存资源
模式结构:
a) 发起人角色(Originator):记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
b) 备忘录角色(Memento):负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
c) 管理者角色(Caretaker):对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
//备忘录
class Memento {
private:
string state;
public:
Memento(string state) {
this->state = state;
}
void setState(string state) {
this->state = state;
}
string getState() {
return state;
}
};
//发起人
class Originator {
private:
string state;
public:
void setState(string state) {
this->state = state;
}
string getState() {
return state;
}
Memento* createMemento() {
return new Memento(state);
}
void restoreMemento(Memento *m) {
this->setState(m->getState());
}
};
//管理者
class Caretaker {
private:
Memento *memento;
public:
void setMemento(Memento *m) {
memento = m;
}
Memento *getMemento() {
return memento;
}
};
int main()
{
Originator *or = new Originator();
Caretaker *cr = new Caretaker();
or->setState("S0");
cout << "初始状态:" + or->getState() << endl;
cr->setMemento(or->createMemento()); //保存状态
or->setState("S1");
cout << "新的状态:" + or->getState() << endl;
or->restoreMemento(cr->getMemento()); //恢复状态
cout << "恢复状态:" + or->getState() << endl;
}
运行结果: