#ifndef SKELETON_H #define SKELETON_H ///////////////////////////////////////////////////////////////////////////// // skeleton.h - demonstrate Memento pattern // // Jim Fawcett, CSE791 - Design Patterns, Summer 2000 // #include #include #include ///////////////////////////////////////////////////////////////////////////// // forward declarations template class Originator; ///////////////////////////////////////////////////////////////////////////// // Memento class template class Memento { public: Memento(Originator *pOrig); void GetState(); void SetState(); private: Originator* _pOrig; state _state; }; template inline Memento::Memento(Originator *pOrig) : _pOrig(pOrig) { } template inline void Memento::GetState() { _state = _pOrig->_state; } template inline void Memento::SetState() { _pOrig->_state = _state; } // ///////////////////////////////////////////////////////////////////////////// // Originator class template class Originator { friend class Memento; public: Originator(const state &s); void Operation(std::string s); void SetMemento(Memento *m); Memento* CreateMemento(); private: state _state; }; template inline Originator::Originator(const state &s) : _state(s) { } template inline void Originator::SetMemento(Memento *m) { m->SetState(); cout << "\n\n Originator retrieving state \"" << _state << "\""; } template inline Memento* Originator::CreateMemento() { cout << "\n Originator creating memento with state \"" << _state << "\""; Memento *pMem = new Memento(this); pMem->GetState(); return pMem; } template inline void Originator::Operation(std::string s) { cout << "\n\n Originator changing state to \"" << s << "\""; _state = s; } // ///////////////////////////////////////////////////////////////////////////// // Caretaker class template class Caretaker { public: Caretaker(Originator *orig); void acceptMemento(); void returnMemento(); private: Originator* _pOrig; std::vector< Memento* > _mementos; }; template inline Caretaker::Caretaker(Originator *pOrig) : _pOrig(pOrig) { } template void Caretaker::acceptMemento() { Memento *pMem = _pOrig->CreateMemento(); _mementos.push_back(pMem); } template inline void Caretaker::returnMemento() { if(_mementos.size() > 0) { Memento *pMem = _mementos.back(); _mementos.pop_back(); _pOrig->SetMemento(pMem); delete pMem; } } #endif