备忘录(Memento)模式
意图:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
主要解决:所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。
何时使用:很多时候我们总是需要记录一个对象的内部状态,这样做的目的就是为了允许用户取消不确定或者错误的操作,能够恢复到他原先的状态,使得他有"后悔药"可吃。
应用实例: 1、后悔药。 2、打游戏时的存档。 3、Windows 里的 ctri + z。 4、IE 中的后退。 4、数据库的事务管理。
代码:
#include <iostream> #include <string> #include <vector> using namespace std; // 记录要保存的数据 class Memento { public: Memento(string s) :_state(s){} string getState() { return _state; } private: string _state; }; class Originator { public: void setState(string s) { _state = s; } string getState() { return _state; } Memento *saveStateToMemento() { return new Memento(_state); } void getStateFromMemento(Memento *m) { _state = m->getState(); } private: string _state; }; //管理类 class CareTaker { public: CareTaker() { _mementoList.clear(); } ~CareTaker() { for (auto it = _mementoList.begin(); it != _mementoList.end(); ++it) { delete *it; } _mementoList.clear(); } void add(Memento *m) { _mementoList.push_back(m); } Memento *get(int index) { if (index < 0 || index >= _mementoList.size()) return NULL; return _mementoList[index]; } private: vector<Memento*> _mementoList; }; void test() { Originator orignator; CareTaker careTaker; orignator.setState("State #1"); orignator.setState("State #2"); careTaker.add(orignator.saveStateToMemento()); orignator.setState("State #3"); careTaker.add(orignator.saveStateToMemento()); orignator.setState("State #4"); cout << "Current State: " << orignator.getState() << endl; orignator.getStateFromMemento(careTaker.get(0)); cout << "Current State: " << orignator.getState() << endl; orignator.getStateFromMemento(careTaker.get(1)); cout << "Current State: " << orignator.getState() << endl; } int main() { test(); cin.get(); return 0; }
效果: