编辑
2025-09-28
C#
00

目录

摘要
正文
结构
示例一:文本编辑器
示例二:游戏状态保存

摘要

备忘录模式是一种行为设计模式,它允许在不破坏封装的情况下捕获和恢复对象的内部状态。该模式通过将对象的状态保存到备忘录对象中,并在需要时从备忘录中恢复状态,实现了对象状态的保存和恢复。

正文

结构

备忘录模式由以下几个角色组成:

  • 发起人(Originator):负责创建备忘录对象,并可以使用备忘录对象来恢复其内部状态。
  • 备忘录(Memento):存储发起人对象的内部状态。
  • 管理者(Caretaker):负责保存和恢复备忘录对象。

示例一:文本编辑器

假设我们正在开发一个文本编辑器,用户可以在编辑器中输入文本并进行编辑操作。我们希望为编辑器添加撤销功能,即用户可以撤销之前的操作并恢复到之前的状态。

首先,我们创建一个备忘录类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}"); }

image.png

示例二:游戏状态保存

假设我们正在开发一个游戏,玩家可以在游戏中进行各种操作并获得不同的游戏状态。我们希望为游戏添加保存和恢复功能,使玩家可以保存当前游戏状态,并在需要时恢复到之前的状态。

首先,我们创建一个备忘录类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}"); }

image.png

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!