4/21/2010

Memento Pattern

Mememto Pattern是一個簡單輕量的模式,基本上它十分簡單,也沒有必要複雜化。故名思義,這種模式是記錄一些回憶,過去資訊,目的是為了備份。在大型軟體中功能複雜而彈性,必定會提供使用者進行設定,在設定途中,總會有使用者想反悔不想執行改變設定,這種模式就是為了取消還原設定而存在的。
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作還原。

1 則留言:

David 提到...

至於漂亮的博客,但你可以做這個博客更冷靜,如果你可以配置的語言轉換pluigin,但都是一樣的,你已經做得很好:) http://www.iessaywriter.com