# 备忘录模式
属于行为型模式。
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
应用场景:
- 如果在某个系统中使用命令模式,需要实现命令的撤销功能,那么命令模式可以使用备忘录模式来储存可撤销操作的状态。
- 当角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时储存起来的备忘录将状态复原。
- 数据库的事务管理
- 存档
缺点:消耗资源,状态数据越多,内存占用就越大。
解决方法:将数据储存到文件中(.txt、.xml、.dat 等文件),由内存占用转变为磁盘占用。
# 类图
# 代码
# 存档类
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