# 备忘录模式

属于行为型模式。
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。

应用场景:

  • 如果在某个系统中使用命令模式,需要实现命令的撤销功能,那么命令模式可以使用备忘录模式来储存可撤销操作的状态。
  • 当角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时储存起来的备忘录将状态复原。
  • 数据库的事务管理
  • 存档

缺点:消耗资源,状态数据越多,内存占用就越大。
解决方法:将数据储存到文件中(.txt、.xml、.dat 等文件),由内存占用转变为磁盘占用。

# 类图

img

# 代码

# 存档类

namespace BehavioralPatterns_MementoPattern
{
    /// <summary>
    /// 存档
    /// </summary>
    public class Archive
    {
        private string state;
        /// <summary>
        /// 状态
        /// </summary>
        public string State { get => state; }
        public Archive(string state)
        {
            this.state = state;
        }
    }
}

# 存档管理类

namespace BehavioralPatterns_MementoPattern
{
    public class ArchiveManger
    {
        private static List<Archive> Archives = new List<Archive>();
        /// <summary>
        /// 添加存档
        /// </summary>
        /// <param name="archive"></param>
        public static void AddArchive(Archive archive)
        {
            Archives.Add(archive);
        }
        /// <summary>
        /// 获取存档
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        public static Archive GetArchive(int index)
        {
            return Archives[index];
        }
    }
}

# 需要存档的类

namespace BehavioralPatterns_MementoPattern
{
    public class Player
    {
        /// <summary>
        /// 状态
        /// </summary>
        public string State;
        public Player(string state)
        {
            State = state;
        }
        public void Show()
        {
            Console.WriteLine(State);
        }
        /// <summary>
        /// 生成存档
        /// </summary>
        /// <returns></returns>
        public Archive SaveState()
        {
            return new Archive(State);
        }
        /// <summary>
        /// 载入存档
        /// </summary>
        /// <param name="archive"></param>
        public void LoadState(Archive archive)
        {
            State = archive.State;
        }
    }
}

# 测试

namespace BehavioralPatterns_MementoPattern
{
    public class Program
    {
        private static void Main(string[] args)
        {
            Player player = new Player("state_0");
            player.Show();
            ArchiveManger.AddArchive(player.SaveState());
            player.State = "state_1";
            player.Show();
            player.LoadState(ArchiveManger.GetArchive(0));
            player.Show();
        }
    }
}

运行结果:
state_0
state_1
state_0