备忘录模式是一种行为设计模式,它允许在不破坏封装的情况下捕获和恢复对象的内部状态。该模式通过将对象的状态保存到备忘录对象中,并在需要时从备忘录中恢复状态,实现了对象状态的保存和恢复。
备忘录模式由以下几个角色组成:
假设我们正在开发一个文本编辑器,用户可以在编辑器中输入文本并进行编辑操作。我们希望为编辑器添加撤销功能,即用户可以撤销之前的操作并恢复到之前的状态。
首先,我们创建一个备忘录类EditorMemento
,用于保存编辑器的状态:
C#public class EditorMemento
{
public string Content { get; }
public EditorMemento(string content)
{
Content = content;
}
}
然后,我们创建一个发起人类TextEditor
,它包含了用户输入的文本内容和一些编辑操作的方法:
C#public class TextEditor
{
private string _content;
public string Content
{
get { return _content; }
set { _content = value; }
}
public EditorMemento CreateMemento()
{
return new EditorMemento(_content);
}
public void RestoreMemento(EditorMemento memento)
{
_content = memento.Content;
}
}
最后,我们创建一个管理者类UndoManager
,用于保存和恢复编辑器的状态:
C#public class UndoManager
{
private Stack<EditorMemento> _mementos = new Stack<EditorMemento>();
public void SaveMemento(EditorMemento memento)
{
_mementos.Push(memento);
}
public EditorMemento GetLastMemento()
{
return _mementos.Pop();
}
}
现在,我们可以在客户端代码中使用备忘录模式来实现撤销功能:
C#static void Main(string[] args)
{
var editor = new TextEditor();
var undoManager = new UndoManager();
editor.Content = "Hello, World!";
undoManager.SaveMemento(editor.CreateMemento());
editor.Content = "Hello, Design Patterns!";
undoManager.SaveMemento(editor.CreateMemento());
editor.Content = "Hello, Memento Pattern!";
Console.WriteLine($"Current content: {editor.Content}");
editor.RestoreMemento(undoManager.GetLastMemento());
Console.WriteLine($"Restored content: {editor.Content}");
editor.RestoreMemento(undoManager.GetLastMemento());
Console.WriteLine($"Restored content: {editor.Content}");
}
假设我们正在开发一个游戏,玩家可以在游戏中进行各种操作并获得不同的游戏状态。我们希望为游戏添加保存和恢复功能,使玩家可以保存当前游戏状态,并在需要时恢复到之前的状态。
首先,我们创建一个备忘录类GameState
,用于保存游戏状态:
C#public class GameState
{
public int Level { get; }
public int Score { get; }
public GameState(int level, int score)
{
Level = level;
Score = score;
}
}
然后,我们创建一个发起人类Game,它包含了游戏的状态和一些操作的方法:
C#public class Game
{
private int _level;
private int _score;
public int Level { get { return _level; } }
public int Score { get { return _score; } }
public void Play()
{
// 游戏逻辑...
_level++;
_score += 100;
}
public GameState CreateGameState()
{
return new GameState(_level, _score);
}
public void RestoreGameState(GameState gameState)
{
_level = gameState.Level;
_score = gameState.Score;
}
}
最后,我们创建一个管理者类GameManager
,用于保存和恢复游戏状态:
C#public class GameManager
{
private Stack<GameState> _gameStates = new Stack<GameState>();
public void SaveGameState(GameState gameState)
{
_gameStates.Push(gameState);
}
public GameState GetLastGameState()
{
return _gameStates.Pop();
}
}
C#static void Main(string[] args)
{
var game = new Game();
var gameManager = new GameManager();
game.Play();
gameManager.SaveGameState(game.CreateGameState());
game.Play();
gameManager.SaveGameState(game.CreateGameState());
game.Play();
Console.WriteLine($"Current level: {game.Level}, Score: {game.Score}");
game.RestoreGameState(gameManager.GetLastGameState());
Console.WriteLine($"Restored level: {game.Level}, Score: {game.Score}");
game.RestoreGameState(gameManager.GetLastGameState());
Console.WriteLine($"Restored level: {game.Level}, Score: {game.Score}");
}
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!