19_备忘录模式
备忘录模式是一种行为型设计模式,它可以捕获一个对象的内部状态,并在需要时将对象恢复到之前的状态。备忘录模式通过将对象的状态封装在备忘录对象中,使得可以在不暴露对象内部实现细节的情况下进行状态的保存和还原。
备忘录模式有三个主要角色:
-
发起人(Originator):负责创建备忘录对象,并可以通过备忘录对象保存和恢复自身的状态。发起人可以是具体类或接口。
-
备忘录(Memento):用于存储发起人对象的状态。备忘录是不可修改的,只能由发起人访问。
-
管理者(Caretaker):负责存储备忘录对象,以便在需要时进行恢复。管理者可以持有多个备忘录对象,用于保存多个状态。
备忘录模式的工作原理如下:
-
发起人创建备忘录对象,并将当前的状态保存到备忘录中。
-
管理者存储备忘录对象,以便在需要时进行恢复。
-
当发起人需要恢复到之前的状态时,可以通过从管理者获取备忘录对象,并将其状态恢复。
备忘录模式的优点包括:
-
提供了一种方式来保存和还原对象的状态,同时又不暴露对象的实现细节。
-
可以方便地实现撤销和恢复功能,以及实现多次撤销和恢复。
-
支持状态的封装和保护,使得对象的状态不会被外部访问和修改。
备忘录模式适用于以下场景:
-
当需要保存和还原对象的状态,并且不希望暴露对象内部细节时,可以使用备忘录模式。
-
当需要实现撤销和恢复功能,以及多次撤销和恢复时,可以使用备忘录模式。
总结而言,备忘录模式通过将对象的状态封装在备忘录对象中,允许在需要时保存和还原对象的状态。它提供了一种简洁的方式来实现状态的保存和恢复,同时保护了对象的状态不被外部访问和修改。
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!"); }