C++設計模式 - 備忘錄模式(Memento)
阿新 • • 發佈:2022-03-22
狀態變化模式
- 在元件構建過程中,某些物件的狀態經常面臨變化,如何對這些變化進行有效的管理?同時又維持高層模組的穩定?“狀態變化”模式為這一問題提供了一種解決方案。
典型模式
- State
- Memento
Memento
動機(Motivation)
- 在軟體構建過程中,某些物件的狀態在轉換過程中,可能由於某種需要,要求程式能夠回溯到物件之前處於某個點時的狀態。如果使用一一些公有介面來讓其他物件得到物件的狀態,便會暴露物件的細節實現。
- 如何實現物件狀態的良好儲存與恢復?但同時又不會因此而破壞物件本身的封裝性。
模式定義
在不破壞封裝性的前提下,捕獲一個物件的內部狀態, 並在該物件之外儲存這個狀態。這樣以後就可以將該物件恢復到原先儲存的狀態。
結構
要點總結
- 備忘錄( Memento )儲存原發器( Originator )物件的內部狀態,在需要時恢復原發器狀態。
- Memento模式的核心是資訊隱藏,即Originator需要向外接隱藏資訊,保持其封裝性。但同時又需要將狀態保持到外界( Memento )。
- 由於現代語言執行時(如C#、Java等 )都具有相當的物件序列化支援,因此往往採用效率較高、又較容易正確實現的序列化方案來實現Memento模式。
cpp
#include<iostream> class Memento { private: std::string state_; //... public: Memento(std::string& state) :state_(state) {} std::string getState()const { return state_; } void setState(std::string& state) { state_ = state; } }; class Originator { private: std::string state_; //... public: Originator() {} Memento createMomento() { Memento m(state_); return m; } void setMomento(const Memento& m) { state_ = m.getState(); } }; int main() { Originator orginator; //捕獲物件狀態,儲存到備忘錄 Memento m = orginator.createMomento(); //... 改變orginator狀態 //從備忘錄中恢復 orginator.setMomento(m); return 0; }