
Memento(备忘录)设计模式属于四组(GoF)设计模式的行为设计模式类别,本文3D天堂将解释什么是备忘录模式以及如何在C#中实现备忘录设计模式。
备忘录设计模式
Memento模式可以存储对象的内部状态,可以稍后使用存储的状态恢复对象,考虑一个游戏的设计,在这个游戏中,希望在不同的检查点或级别上存储给定对象的状态,稍后玩家将能够使用存储的状态恢复该对象,Memento设计模式将在这种情况下有所帮助。
四组 (GoF) 定义:
在不违反封装的情况下,捕获并外部化对象的内部状态,以便稍后可以将对象恢复到该状态。
备忘录设计模式 – UML

上述UML图中的参与者是:
- Memento:存储发起者对象的内部状态,状态变量表示内部状态。
- Originator:创建和使用纪念品,稍后使用备忘录的状态保存和恢复此类。
- 状态变量表示发起者的内部状态。
- 创建一个memento(CreateMemento)来保存originator的内部状态。
- 设置一个备忘录(SetMemento)来恢复发起者的内部状态,此方法接受一个备忘录对象。
- Caretaker:这个类负责memento的保管,客户端永远不会直接访问备忘录对象,Caretaker对象负责客户端交互。
C#中的备忘录设计模式示例
问题陈述
用一个简单的游戏来理解C#中的备忘录设计模式。
- 考虑一个包含三个级别的游戏。
- 任何清除所有三个级别的玩家都将赢得比赛。
- 玩家将获得三个生命线来赢得比赛。
- 如果玩家清除任何中间级别(小于最终级别)并在下一级别失去生命线,那么它将再次从最后一个完整级别开始,这里的memento模式对于存储完成关卡的状态和恢复相同关卡很有用。
类图

上面类图中的参与者是:
- Player:发起者类
- Memento:纪念类
- Caretaker : 看守类
C#中的备忘录模式代码
using System;
using System.Threading;
namespace MementoPatternDemo
{
//'Memento' class
public class Memento
{
public int Level;
public int Score;
public string Health;
public Memento(int level, int score, string health)
{
this.Level = level;
this.Score = score;
this.Health = health;
}
}
//'CareTaker' class
public class CareTaker
{
// store a checkpoint for already crossed level
public Memento LevelMarker;
}
//'Originator' Class
public class Player
{
public int Level;
public int Score;
public string Health;
public int lifeline = 3;
public Memento CreateMarker(Player player)
{
return new Memento(player.Level, player.Score, player.Health);
}
public void RestoreLevel(Memento playerMemento)
{
this.Level = playerMemento.Level;
this.Score = playerMemento.Score;
this.Health = playerMemento.Health;
this.lifeline -= 1;
}
public void DisplayPlayerInfo()
{
Console.WriteLine("Level: " + this.Level);
Console.WriteLine("Score: " + this.Score);
Console.WriteLine("Health: " + this.Health);
Console.WriteLine("Lifeline left: " + this.lifeline);
}
}
//'client'
class Program
{
static void Main(string[] args)
{
// player has completed level 1
Player player = new Player();
player.Level = 1;
player.Score = 100;
player.Health = "100%";
Console.WriteLine("----------- Player info after completing level 1 ---------------------");
player.DisplayPlayerInfo();
// when player completes any level then create checkpoint for that level.
CareTaker careTaker = new CareTaker();
careTaker.LevelMarker = player.CreateMarker(player);
// sleep is only added to show some delay..
Thread.Sleep(2000);
player.Level = 2;
player.Score = 130;
player.Health = "80%";
Console.WriteLine("--------------- Player info in level 2 --------------------------------");
player.DisplayPlayerInfo();
// if players loses all the lifeline then restore the game from level 1
player.RestoreLevel(careTaker.LevelMarker);
Console.WriteLine("------------- Player info after restoring level 1 data ----------------");
player.DisplayPlayerInfo();
Console.ReadLine();
}
}
}
最终结果

…
以上是3D天堂关于C#中的备忘录设计模式的全部内容,如果你有任何反馈,请随时在本页面下方留言。