您好,登錄后才能下訂單哦!
當我們在實際應用中需要提供撤銷機制,當一個對象可能需要再后續操作中恢復其內部狀態時,就需要使用備忘錄模式。其本質就是對象的序列化和反序列化的過程,支持回滾操作。
作用
在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態,這樣以后就可以將該對象恢復到原先的狀態。
類視圖
實現
typedef struct sysstate; //假設的一個空結構,用來代表系統狀態 //還原點 class Memento { public: Memento(sysstate &statein) { state = statein; } sysstate& getstate(){ return state} private: sysstate state; }; //運行系統 class system { public: void recovery(Memento* pMem) { if (pMem) { state = pMem->getstate(); } } Memento* backup() { return new Memento(state); } private: sysstate state; }; //還原控制器 class recoveryControl { public: ~recoveryControl() { map<long,Memento*>::iterator iter; for ( iter = m_mementos.begin(); iter != m_mementos.end(); iter++) { delete iter.second; } } long addRecoveryPoint(Memento* pMem) { long t = clock(); m_mementos.instert(pair<long,Memento*>(t, pMem)); return t; } Memento* GetRecoveryPoint(long time) { map<long,Memento*>::iterator iter; iter = m_mementos.find(time); if(iter != m_mementos.end()) return iter->second; return NULL; } void DelRecoveryPoint(long time) { Memento* pMem = GetRecoveryPoint(time); m_mementos.erase(time); delete pMem; } private: map<long,Memento*> m_mementos; }; int main() { system Sys; recoveryControl controler; //備份系統并存入備份管理器中 long time1 = controler.addRecoveryPoint(Sys.backup()); long time2 = controler.addRecoveryPoint(Sys.backup()); //將系統恢復到time1狀態 Sys.recovery(controler.GetRecoveryPoint(time1)); //將系統恢復到time2狀態 Sys.recovery(controler.GetRecoveryPoint(time2)); }
應用場景
支持回滾操作的 地方,如游戲存檔、事務回滾、程序的撤銷和恢復操作等。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。