Mememto Pattern是一個簡單輕量的模式,基本上它十分簡單,也沒有必要複雜化。故名思義,這種模式是記錄一些回憶,過去資訊,目的是為了備份。在大型軟體中功能複雜而彈性,必定會提供使用者進行設定,在設定途中,總會有使用者想反悔不想執行改變設定,這種模式就是為了取消還原設定而存在的。
假設ConfigDialog是一個供使用者設定Core的UI介面,當使用者修改途中按取消鍵,會呼叫OnCancel(),這函式就把一開始的CoreMemento提供給Core作還原。
class CoreMemento {
friend class Core;
private:
CoreMemento() {}
CoreMemento(const CoreMemento&);
CoreMemento& operator=(const CoreMemento&);
// member data
};
class Core {
public:
// member function, getter/setter function
CoreMemento getMemento();
bool recovery(const CoreMemento&);
};
class ConfigDialog {
public:
ConfigDialog(Core& core) : m_core(core) {
m_memento = m_core.getMemento();
}
void OnCancel() {
core. recovery(m_backup);
}
// member function, setting core function
private:
Core& m_core;
CoreMemento m_backup;
};
Memento class的實作如上所示,它沒有成員函式,只有成員變數記錄資料,亦沒有任何資料對外公開,甚至宣告copy constructor和operator=為私有不讓programmer複製物件,只宣告friend class讓Core作存取。因為實際上Memento class的用途只為了記錄Core的資料供還原使用,過多的公開是不必的,還可能誤導programmer認為Memento是可修改的,良好的設計應該在編譯期就檢查出來。假設ConfigDialog是一個供使用者設定Core的UI介面,當使用者修改途中按取消鍵,會呼叫OnCancel(),這函式就把一開始的CoreMemento提供給Core作還原。

0 comments:
張貼意見