19_備忘錄模式

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

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

  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!");
        }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章