备忘录模式是一种行为型模式
优点:
备忘录模式的主要优点是提供了一种可以恢复状态的机制。当用户需要时能够比较方便地将数据恢复到某个历史的状态。它实现了内部状态的封装,除了创建它的发起人之外,其他对象都不能够访问这些状态信息。此外,它简化了发起人类。发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则1。
缺点:
它可能会消耗大量资源。如果要保存的内部状态信息过多或者特别频繁,将会占用比较大的内存资源。
满足的设计模式:
备忘录模式遵循了封装性原则。它在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。
常用实例:
备忘录模式常用于需要保存与恢复数据的场景,如玩游戏时的中间结果的存档功能。它也可以用于提供一个可回滚操作的场景,
如 Word、记事本、Photoshop,Eclipse 等软件在编辑时按 Ctrl+Z 组合键,还有数据库中事务操作。
类图:
代码:
#include "iostream"
#include "string"
#include <vector>
using namespace std;
class Memento
{
public:
Memento(string state):state_(state){};
string GetState(){return state_;}
private:
string state_;
};
class Originator
{
public:
void SetState(string state)
{
state_=state;
}
string GetState()
{
return state_;
}
//创建备忘录
Memento*CreateMemento()
{
return new Memento(state_);
}
//恢复备忘录
void RestoreState(Memento* memento)
{
state_=memento->GetState();
}
private:
string state_;
};
class Careker
{
public:
void AddMemento(Memento* memento)
{
mementos_.push_back(memento);
}
Memento* GetMemento(int index)
{
return mementos_[index];
}
private:
vector<Memento*>mementos_;
};
int main()
{
Originator originator;
Careker careker;
originator.SetState("State 1");
careker.AddMemento(originator.CreateMemento());
originator.SetState("State 2");
careker.AddMemento(originator.CreateMemento());
originator.SetState("State 3");
careker.AddMemento(originator.CreateMemento());
originator.RestoreState(careker.GetMemento(0));
cout<<originator.GetState()<<endl;
return 0;
}