備忘錄模式(Memento):在不破壞封裝性的前提下,捕獲一個對象內部狀態,並在該對象之外儲存這個狀態。這樣以後就可以將該對象恢複到原先儲存的狀態。
備忘錄模式結構圖:
Originator(發起人):負責建立一個備忘錄Memento,用以記錄當前時刻它的內部狀態,並可使用備忘錄恢複內部狀態。Originator可根據需要決定Memento儲存Originator的哪些內部狀態。
Memento(備忘錄):負責儲存Originator對象的內部狀態,並可防止Originator以外的其他對象訪問備忘錄Memento。備忘錄有兩個介面,Caretaker只能看到備忘錄的窄介面,它的能將備忘錄傳遞給其他對象。Originator能夠看到一個寬介面,允許它訪問返回到先前狀態所需要的所有資料。
Caretaker(管理者):負責儲存備忘錄Memento,不能對備忘錄的內容進行操作或檢查。
備忘錄模式基本代碼:
發起人(Originator)類:
class Originator
{
private:
String state;
public:
String getState()
{
return state;
}
void setState(String state)
{
this->state=state;
}
Memento * CreateMemento()
{
return (new Memento(state))
}
void SetMemento(Memento * memento)
{
this->state = memento->state;
}
void Show()
{
cout<< “目前狀態:”<<state<<endl;
}
};
備忘錄(Memento)類:
class Memento
{
private:
String state;
public:
Memento(String state)
{
this->state=state;
}
String getState()
{
return state;
}
};
管理者(Caretaker)類:
class Caretaker
{
private:
Memento *memento;
public:
Memento * getMemento()
{
return this->memento;
}
void setMemento(Memento * memento)
{
this->memento = memento;
}
};
用戶端程式:
void main()
{
Originator * o = new Originator(); //Originator初始狀態,狀態屬性為“On”
o->setState(“On”);
o->Show();
Caretaker *c= new Caretaker();
c->setMemento(o->CreateMemento);
o->setState(“off”); //Originator改變了狀態屬性為“Off”
o->Show();
o->setMemento(c->getMemento()); //恢複原始狀態
o->Show();
}
總結:
把要儲存的細節給封裝在Memento中
Memento模式比較適用於功能比較複雜的,但需要維護或記錄屬性曆史的類,或者需要儲存的屬性只是眾多屬性中的一小部分時,Originator可以根據儲存的Memento資訊還原到前一個狀態。
如果在某個系統中使用命令模式時,需要實現命令的撤銷功能,那麼命令模式可以使用備忘錄模式來儲存可撤銷操作的狀態。