設計模式(十九):備忘錄模式

K戰神發表於2016-01-25

一、定義

在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。這樣就可以將該物件恢復到原先儲存的狀態

二、例項

2.1 發起人:記錄當前時刻的內部狀態,負責定義哪些屬於備份範圍的狀態,負責建立和恢復備忘錄資料。

 public class Originator
    {
        private string state = string.Empty;
        public string GetState()
        {
            return state;
        }
        public void SetState(string _state)
        {
            state = _state;
        }
        public Memento CreatMemento()
        {
            return new Memento(state);
        }
        public void RestoreMemento(Memento _memento)
        {
            SetState(_memento.GetState());
        }
    }

2.2 備忘錄:負責儲存發起人物件的內部狀態,在需要的時候提供發起人需要的內部狀態。

public class Memento
    {
        private string state = string.Empty;
        public Memento(string _state)
        {
            state = _state;
        }
        public string GetState()
        {
            return state;
        }
        public void SetState(string _state)
        {
            state = _state;
        }
    }

2.3 管理角色:對備忘錄進行管理,儲存和提供備忘錄。

public class Caretaker
    {
        private Memento memento;
        public void SetMemento(Memento _memento)
        {
            memento = _memento;
        }
        public Memento GetMemento()
        {
            return memento;
        }
    }

2.4 客戶端:

//-------------------------備忘錄模式---------------------
            Memento.Originator originator = new Memento.Originator();
            originator.SetState("初始狀態—1");
            Console.WriteLine("初始狀態:{0}", originator.GetState());
            //備忘狀態
            Memento.Caretaker caretaker = new Memento.Caretaker();
            caretaker.SetMemento(originator.CreatMemento());
            //修改狀態
            originator.SetState("狀態—2");
            Console.WriteLine("修改狀態:{0}", originator.GetState());
            //恢復狀態
            originator.RestoreMemento(caretaker.GetMemento());
            Console.WriteLine("恢復後狀態:{0}", originator.GetState());
            Console.ReadKey();

結果:

三、總結

優:

  • 當發起人角色中的狀態改變時,有可能這是個錯誤的改變,我們使用備忘錄模式就可以把這個錯誤的改變還原。
  • 備份的狀態是儲存在發起人角色之外的,這樣,發起人角色就不需要對各個備份的狀態進行管理。

缺:

  • 在實際應用中,備忘錄模式都是多狀態和多備份的,發起人角色的狀態需要儲存到備忘錄物件中,對資源的消耗是比較嚴重的。

相關文章