備忘錄模式旨在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。這樣以后就可將該對(duì)象恢復(fù)到原先保存的狀態(tài)。在命令模式中,備忘錄模式經(jīng)常還經(jīng)常被用來(lái)維護(hù)可以撤銷(xiāo)(Undo)操作的狀態(tài)。
類(lèi)圖:

Memento模式中封裝的是需要保存的狀態(tài),當(dāng)需要恢復(fù)的時(shí)候才取出來(lái)進(jìn)行恢復(fù).原理很簡(jiǎn)單,實(shí)現(xiàn)的時(shí)候需要注意一個(gè)地方:窄接口和寬接口.所謂的寬接口就是一般意義上的接口,把對(duì)外的接口作為public成員;而窄接口反之,把接口作為private成員,而把需要訪問(wèn)這些接口函數(shù)的類(lèi)作為這個(gè)類(lèi)的友元類(lèi),也就是說(shuō)接口只暴露給了對(duì)這些接口感興趣的類(lèi),而不是暴露在外部.下面的實(shí)現(xiàn)就是窄實(shí)現(xiàn)的方法來(lái)實(shí)現(xiàn)的.
Memento模式比較適用于功能比較復(fù)雜的,但需要維護(hù)或記錄歷史屬性的類(lèi),或者需要保存的屬性只是眾多屬性中的一小部分時(shí),Originator可以根據(jù)保存的Memento信息還原到前一狀態(tài)。
如果在某個(gè)系統(tǒng)中使用命令模式時(shí),需要實(shí)現(xiàn)命令的撤銷(xiāo)功能,那么命令模式可以使用備忘錄模式來(lái)存儲(chǔ)可撤銷(xiāo)操作的狀態(tài)。
實(shí)例:
#include <iostream> #include <string> using namespace std; class Memento { private: string state; public: Memento(string state) :state(state) {} string GetState() { return state; } void SetState(string state) { this->state = state; } }; class CareTaker { private: Memento *memento; public: void SetMemento(Memento *memento) { this->memento = memento; } Memento* GetMemento() { return this->memento; } }; class Originator { private: string state; public: Originator(string state) { this->state = state; } void RestoreMemento(Memento *memento) { state = memento->GetState(); } Memento *CreateMemento() { return new Memento(state); } void SetState(string state) { this->state = state; } void ShowState() { cout<< this->state <<endl; } }; int main() { Originator *originator = new Originator("2012年11月11日,光棍節(jié),一個(gè)人,沒(méi)有女朋友"); CareTaker *caretaker = new CareTaker(); caretaker->SetMemento(originator->CreateMemento()); cout<<"2012年11月11日,光棍節(jié)早晨的狀態(tài)是:"<<endl; originator->ShowState(); originator->SetState("中午參加同學(xué)婚禮去了,錦府鹽幫飯店"); originator->ShowState(); cout<<"晚上回來(lái)的狀態(tài)是"<<endl; originator->RestoreMemento(caretaker->GetMemento()); originator->ShowState(); cout<<"跟早晨一樣,嗨"<<endl; system("pause"); return 0; } 輸出是這樣的

備忘錄模式適用性:
新聞熱點(diǎn)
疑難解答
網(wǎng)友關(guān)注