/ janturon.cz / Od kodéra k analytikovi / Memento

Memento

Memento

Memento se používá k uložení stavu objektu. Narozdíl od vzoru Command, který tuto funkčnost také může realizovat, neprobíhá uložení automaticky před voláním metody, ale kdykoliv po zavolání Save(). Není tedy zapotřebí ani žádného rozhraní.

Příklad

Mějme třídu uchovávající číslo a řetězec:

class StrAndInt { string s; int i; public: StrAndInt() { } StrAndInt(string s, int i) : s(s), i(i) { } void Set(int i) { this->i = i; } void Set(string s) { this->s = s; } void Info() { cout << i << " " << s << endl; } };

Šablonová třída Memento umožní zapamatování stavu jakékoliv třídy určené šablonovou proměnnou:

template <typename T> class Memento { vector<T*> states; public: void Save(T* data) { states.push_back(new T(*data)); } T* Load(T* prev=NULL) { if(prev!=NULL) delete prev; T* result = states.back(); states.pop_back(); return result; } };

jak vidno z tohoto příkladu:

int main() { Memento store; StrAndInt* si = new StrAndInt("A",1); store.Save(si); si->Set(2); si->Set("B"); si->Info(); si = store.Load(si); si->Info(); return 0; }

Zde metoda Load() vrátí objekt uložený předchozím voláním Save() a navíc uvolní z paměti aktuální objekt. Způsob ukládání/načítání se ale může lišit podle požadavků aplikace.