首頁 » 設計模式 » 備忘錄(Memento)

備忘錄(Memento)

作者:

分類:

備忘錄(Memento)

概念

備忘錄模式是一種行為型模式,概念是建立一個負責儲存暫存狀態的物件,可以在必要時回復最後被記錄的狀態,在應用上很廣泛比如文章編輯時暫存、參數修改時暫存,或是遊戲內的暫存紀錄點…等等。

更重要的是備忘錄模式會把暫存的狀態從原本的物件分離,可以保持原物件的功能不受影響。

範例

//**************
//* author: cian
//* 20231111
//**************

/* 系統狀態 */
enum StateEnum
{
    None,
    StateA,
    StateB,
    StateC,
    StateD,
}

/* Originator */
class Originator
{   
    private Memento memento = new Memento();
    private StateEnum _state = StateEnum.None;
    public StateEnum State
    {
        get { return _state; }
        set 
        {
            if(_state == value) return;
            _state = value;
            //Do OnPropertyChanged...
        }
    }
    
    public void SaveState()
    {
        memento.StateStored = _state;
    }
    
    public void RestoreState()
    {
        State = memento.StateStored;
    }
    
    class Memento
    {
        public StateEnum StateStored { get; set; }
    }
}

class MainApp
{
    static void Main(string[] args)
    {
        Originator origin = new Originator();
        origin.State = StateEnum.StateA;  //StateA
        origin.State = StateEnum.StateB;  //StateB
        origin.SaveState();
        origin.State = StateEnum.StateC;  //StateC
        origin.SaveState();               //roll back to StateB.
    }
}

結語

可以看到備忘錄模式在C#方便的getter、setter幫助下,在Originator內加入Memento類別的意義並不大,在要被儲存屬性少的狀況下直接寫個private去記憶就可,但當需要記憶完整副本時,一個一個屬性去拷貝又很冗長笨重,這時可以搭配原型模式直接Clone一個副本也是很靈活的運用。

以上為學習過程的問題紀錄
如果文章有誤,歡迎前輩留言請不吝指教。

「cian」的個人頭像

留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *