Memento是Design Pattern的一種.
其目的是,在不違反封裝原則的前提下.採集和備份一個對象的內部狀態以便這個對象可以在以後恢復到之前的某個狀態.
基本介紹
- 中文名:備忘錄模式
- 外文名:Memento Pattern
概述,代碼,
概述
Memento是Design Pattern的一種.
其目的是,在不違反封裝原則的前提下.採集和備份一個對象的內部狀態以便這個對象可以在以後恢復到之前的某個狀態.
在Memento模式中,有如下角色:
Memento (備忘錄)
* 存儲Originator的內部狀態. 根據Originator的需要.可以存儲任意的內部狀態.
* 保護對狀態的訪問.除了Originator對象外,其他對象不能訪問其存儲的內部狀態.Memeoto實際上提供了2個接口.
Caretaker只能訪問Memento的窄接口(narrow interface) - 它只能夠把memento傳遞給其他對象.
相反,Originator可以訪問Memento的寬接口(wide interface). 通過這個接口,可以讓Originator獲取足夠的信息以恢復到之前的狀態.理想情況下,只有創建memento的Originator才有許可權訪問memento的內部狀態信息.
Originator
* 可以創建一個新的memento, 並把自己的當前狀態信息存儲到memento裡面
* 可以使用memento來恢復其內部狀態信息
Caretaker
* 負責維護和管理memento對象
* 從不對memento的內容進行操作或者測試
代碼
// deque::rbegin/rend#include <iostream>#include <deque>#include <string>using namespace std;class Memento{private: string _state;public: Memento(const string &str):_state(str){} const string &get(){return _state;}};class Caretaker{private: Memento *_memento;public: Caretaker(Memento *pM){_memento = pM;} Memento &get(){return *_memento;} };class Originator{private: string _state;public: void set(const string &str){_state = str;} const string &get(){return _state;} Memento* CreateMemento(){return new Memento(_state);} void SetMemento(Memento &memento){_state = memento.get();}};int main (){ Originator O; O.set("On"); cout << O.get() << endl; Caretaker C(O.CreateMemento()); O.set("Off"); cout << O.get() << endl; O.SetMemento(C.get()); cout << O.get() << endl;}