備忘錄模式 Memento Pattern

設計模式系列

定義:將一個物件內部狀態儲存在另一個備忘錄物件中,備忘錄物件可用來還原物件狀態。

Originator:專門表牛內部狀態的物件,例如遊戲Role Status,文書編輯器文字。

Memento:保留Originator內部狀態資料物件,EX:遊戲存檔的資料

Caretaker:主要功用管理Memento物件

主要解決:在不破壞封裝前提下,捕捉物件內部狀態,在該物件之外保存這個狀態,可以
                  日後將物件回復原先保存狀態。

使用時機:需要記錄物件內部狀態,為了能讓操作者取消或不確定,恢復之前狀態。

如何解決:透過一個備忘錄專門儲存物件狀態。

應用實例:
遊戲存檔、Windows CTRL+Z。

優點:提供回復狀態機制,可回到先前狀態、實現訊息封裝,使用者不需要關心狀態保存細節。

缺點:消耗資源,因為類別的屬性變數過多,且每一次保存都會消耗一定的記憶體資源。

    class Program
    {
        static void Main(string[] args)
        {
            Originator o = new Originator();
            o.State = "On";
            o.Show();

            Caretaker c = new Caretaker();
            c.Memento = o.CreateMemento();

            o.State = "Off";
            o.Show();
            o.SetMemento(c.Memento);
            o.Show();
            Console.Read();
        }
    }

    class Originator
    {
        private string state;
        public string State
        {
            get { return state; }
            set { state = value; }
        }

        public Memento CreateMemento()
        {
            return (new Memento(state));
        }

        public void SetMemento(Memento memento)
        {
            state = memento.State;
        }

        public void Show()
        {
            Console.WriteLine("State="+ state);
        }
    }


    class Memento
    {
       private string state;
       public Memento(string state)
       {
            this.state = state;
       }

        public string State { get { return state; } }
    }

    class Caretaker
    {
        public Memento Memento { get; set; }
    }

 

元哥的筆記