19_備忘錄模式

野码發表於2024-03-15

備忘錄模式是一種行為型設計模式,它可以捕獲一個物件的內部狀態,並在需要時將物件恢復到之前的狀態。備忘錄模式透過將物件的狀態封裝在備忘錄物件中,使得可以在不暴露物件內部實現細節的情況下進行狀態的儲存和還原。

備忘錄模式有三個主要角色:

  1. 發起人(Originator):負責建立備忘錄物件,並可以透過備忘錄物件儲存和恢復自身的狀態。發起人可以是具體類或介面。

  2. 備忘錄(Memento):用於儲存發起人物件的狀態。備忘錄是不可修改的,只能由發起人訪問。

  3. 管理者(Caretaker):負責儲存備忘錄物件,以便在需要時進行恢復。管理者可以持有多個備忘錄物件,用於儲存多個狀態。

備忘錄模式的工作原理如下:

  1. 發起人建立備忘錄物件,並將當前的狀態儲存到備忘錄中。

  2. 管理者儲存備忘錄物件,以便在需要時進行恢復。

  3. 當發起人需要恢復到之前的狀態時,可以透過從管理者獲取備忘錄物件,並將其狀態恢復。

備忘錄模式的優點包括:

  1. 提供了一種方式來儲存和還原物件的狀態,同時又不暴露物件的實現細節。

  2. 可以方便地實現撤銷和恢復功能,以及實現多次撤銷和恢復。

  3. 支援狀態的封裝和保護,使得物件的狀態不會被外部訪問和修改。

備忘錄模式適用於以下場景:

  1. 當需要儲存和還原物件的狀態,並且不希望暴露物件內部細節時,可以使用備忘錄模式。

  2. 當需要實現撤銷和恢復功能,以及多次撤銷和恢復時,可以使用備忘錄模式。

總結而言,備忘錄模式透過將物件的狀態封裝在備忘錄物件中,允許在需要時儲存和還原物件的狀態。它提供了一種簡潔的方式來實現狀態的儲存和恢復,同時保護了物件的狀態不被外部訪問和修改。

IOriginator

 /// <summary>
    /// 發起人抽象介面
    /// </summary>
    public interface IGameState
    {
        /// <summary>
        /// 等級
        /// </summary>
        int Level { get; set; }
        /// <summary>
        /// 經驗值
        /// </summary>
        int Exp { get; set; }
    }

Originator

/// <summary>
    /// 發起人實現
    /// </summary>
    public class GameState : IGameState
    {
        /// <summary>
        /// 等級
        /// </summary>
        public int Level { get; set; }
        /// <summary>
        /// 經驗值
        /// </summary>
        public int Exp { get; set; }

        /// <summary>
        /// 備份
        /// </summary>
        /// <returns></returns>
        public Memo Create()
        {
            return new Memo(Level, Exp);
        }

        /// <summary>
        /// 還原
        /// </summary>
        /// <param name="memo"></param>
        public void Restore(Memo memo)
        {
            Level= memo.Level;
            Exp= memo.Exp;
        }

        public void Display()
        {
            Console.WriteLine($"Level等級:{Level},Exp經驗值:{Exp}");
        }
    }

Memento

/// <summary>
    /// 備忘錄
    /// </summary>
    public class Memo : IGameState
    {
        /// <summary>
        /// 等級
        /// </summary>
        public int Level { get; set; }
        /// <summary>
        /// 經驗值
        /// </summary>
        public int Exp { get; set; }

        public Memo(int level, int exp)
        {
            Level = level;
            Exp = exp;
        }
    }

Caretaker

 public class Caretaker
    {
        private Memo Memo { get; set; }

        /// <summary>
        /// 備份
        /// </summary>
        /// <param name="gameState"></param>
        public void Backup(GameState gameState)
        {
            Console.WriteLine("管理者正在備份遊戲資料");
            Memo = gameState.Create();
        }

        /// <summary>
        /// 還原
        /// </summary>
        /// <param name="gameState"></param>
        public void Restore(GameState gameState)
        {
            Console.WriteLine("管理者正在還原遊戲狀態");
            gameState.Restore(Memo);
        }
    }

呼叫

public class Client
    {
        public void Start()
        {
            GameState state = new GameState();
            state.Level= 1;
            state.Exp = 100;
            state.Display();

            Console.WriteLine("-------------------------------");

            Caretaker caretaker = new Caretaker();
            caretaker.Backup(state);//備份

            //修改遊戲資料
            state.Level= 2;
            state.Exp= 200;
            state.Display();


            //還原遊戲資料
            caretaker.Restore(state);
            state.Display();
        }
    }
static void Main(string[] args)
        {
            new Client().Start();
            Console.ReadKey();
            Console.WriteLine("Hello, World!");
        }

相關文章