備忘錄(Memento):在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象以外保存這個狀態。這樣之後就可將該對象恢復到原先保存的狀態。ios
Originator(發起人):負責建立一個備忘錄Memento,用以記錄當前時刻它的內部狀態,並可以使用備忘錄恢復內部狀態。Originator可根據須要決定Memento存儲Originator的那些狀態。Memento(備忘錄):負責存儲Originator對象的內部狀態,並可防止Originator之外的對象訪問備忘錄Memento。備忘錄有兩個接口,Caretaker只能看到備忘錄的窄接口,它只能將備忘錄傳遞給其餘對象。Originator可以看到一個寬接口,容許它訪問返回到先前狀態所需的全部數據。Caretaker(管理者):負責保存好備忘錄Memento,不能對備忘錄的內容進行操做或檢查。這當中要保存的細節給封裝在了Memento中,那一天要更改保存的細節也不用影響客戶端了。this
代碼基本模板spa
#include <iostream> using namespace std; //備忘錄(Memento)類 class Memento { private: string m_state; public: Memento(string state):m_state(state) { } string getState() { return this->m_state; } }; //發起人(Originator)類 class Originator { private: string m_state; public: void setState(string state) { this->m_state=state; } string getState() { return this->m_state; } //建立備忘錄,將當前須要保存的信息導入並實例化一個Memento對象 Memento *CreateMemento() { return (new Memento(this->m_state)); } //恢復備忘錄,將Memento導入並將相關數據恢復 void SetMemento(Memento *memento) { this->m_state=memento->getState(); } void Show() { cout << "State=" << this->m_state << endl; } }; //管理者(Caretaker)類 class Caretaker { private: Memento *m_memento; public: //設置備忘錄 void setMemento(Memento *memento) { this->m_memento=memento; } //獲得備忘錄 Memento *getMemento() { return this->m_memento; } }; int main() { Originator *O=new Originator(); O->setState("On"); O->Show(); Caretaker *c=new Caretaker(); c->setMemento(O->CreateMemento()); O->setState("Off"); O->Show(); O->SetMemento(c->getMemento()); O->Show(); return 0; }
備忘錄所用場合:Memento模式比較適用於功能比較複雜的,但須要維護或記錄屬性歷史的類,或者須要保存的屬性只是衆多屬性中的一小部分時,Originator能夠根據保存的Memento信息還原到前一狀態。若是在某個系統中使用命令模式時,須要實現命令的撤銷功能,那麼命令模式可使用備忘錄模式來保存可撤銷操做的狀態。有時一些對象的內部信息必須保存在對象之外的地方,可是必需要有對象本身讀取,這時,使用備忘錄能夠把複雜的對象內部信息對其餘的對象屏蔽起來,從而能夠恰當地保持封裝的邊界。其實最大的做用是在當角色的狀態改變的時候,有可能這個狀態無效,這時候就可使用暫時存儲起來的備忘錄將狀態復原。code
遊戲進度備忘對象
#include <iostream> using namespace std; class RoleStateMemento { private: int m_vit; int m_atk; int m_def; public: RoleStateMemento(int vit,int atk,int def) { this->m_vit=vit; this->m_atk=atk; this->m_def=def; } int getVit() { return this->m_vit; } int getAtk() { return this->m_atk; } int getDef() { return this->m_def; } }; class GameRoles { private: int m_vit; int m_atk; int m_def; public: RoleStateMemento *SaveState() { return (new RoleStateMemento(this->m_vit,this->m_atk,this->m_def)); } void RecoveryState(RoleStateMemento *memento) { this->m_vit=memento->getVit(); this->m_atk=memento->getAtk(); this->m_def=memento->getDef(); } void GetInitState() { this->m_vit=100; this->m_atk=100; this->m_def=100; } void Fight() { this->m_vit=0; this->m_atk=0; this->m_def=0; } void StateDisplay() { cout << "角色當前狀態:" << endl; cout << "體力:" << this->m_vit << endl; cout << "攻擊力:" << this->m_atk << endl; cout << "防護力:" << this->m_def << endl; } }; class RoleStateCaretaker { private: RoleStateMemento *m_memento; public: void SetMemento(RoleStateMemento *memento) { this->m_memento=memento; } RoleStateMemento *GetMemento() { return this->m_memento; } }; int main() { //大戰Boss前 GameRoles *lixiaoyao=new GameRoles(); lixiaoyao->GetInitState(); lixiaoyao->StateDisplay(); //保存進度 RoleStateCaretaker *stateAdmin=new RoleStateCaretaker(); stateAdmin->SetMemento(lixiaoyao->SaveState()); //大戰Boss時,損耗嚴重 lixiaoyao->Fight(); lixiaoyao->StateDisplay(); //恢復以前狀態 lixiaoyao->RecoveryState(stateAdmin->GetMemento()); lixiaoyao->StateDisplay(); return 0; }