C#设计模式(行为型模式):备忘录模式,时光倒流的魔法

C#设计模式:备忘录模式,时光倒流的魔法

在软件开发中,我们经常会遇到需要保存对象状态,并在未来某个时刻恢复的场景。例如:

  • 撤销操作: 文本编辑器中的撤销功能,游戏中的回退操作。
  • 事务回滚: 数据库操作失败时,回滚到之前的状态。
  • 游戏存档: 保存游戏进度,方便下次继续游戏。

为了实现这些功能,我们可以使用备忘录模式(Memento Pattern),它提供了一种在不破坏封装性的前提下,捕获并外部化对象的内部状态,以便以后可以将对象恢复到原先保存的状态。

一、备忘录模式简介

备忘录模式属于行为型设计模式,它主要解决的是在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后恢复对象到原先保存的状态。

二、备忘录模式的结构

备忘录模式包含三个角色:

  1. Originator(原发器): 需要保存状态的对象。
  2. Memento(备忘录): 存储原发器内部状态的对象。
  3. Caretaker(管理者): 负责保存备忘录,但不能对备忘录的内容进行操作或检查。

三、C# 实现示例

让我们通过一个简单的文本编辑器示例来理解备忘录模式:

csharp 复制代码
// 原发器:文本编辑器
class TextEditor
{
    private string _text;

    public string Text
    {
        get { return _text; }
        set { _text = value; }
    }

    // 创建备忘录
    public TextMemento CreateMemento()
    {
        return new TextMemento(_text);
    }

    // 恢复备忘录
    public void RestoreMemento(TextMemento memento)
    {
        _text = memento.GetSavedText();
    }
}

// 备忘录:保存文本编辑器的状态
class TextMemento
{
    private readonly string _text;

    public TextMemento(string text)
    {
        _text = text;
    }

    public string GetSavedText()
    {
        return _text;
    }
}

// 管理者:负责保存和恢复备忘录
class History
{
    private Stack<TextMemento> _mementos = new Stack<TextMemento>();

    public void Save(TextEditor editor)
    {
        _mementos.Push(editor.CreateMemento());
    }

    public void Undo(TextEditor editor)
    {
        if (_mementos.Count > 0)
        {
            editor.RestoreMemento(_mementos.Pop());
        }
    }
}

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        TextEditor editor = new TextEditor();
        History history = new History();

        editor.Text = "First line";
        history.Save(editor); // 保存状态

        editor.Text = "Second line";
        history.Save(editor); // 保存状态

        editor.Text = "Third line";
        Console.WriteLine(editor.Text); // 输出: Third line

        history.Undo(editor); // 撤销
        Console.WriteLine(editor.Text); // 输出: Second line

        history.Undo(editor); // 撤销
        Console.WriteLine(editor.Text); // 输出: First line
    }
}

四、备忘录模式的优缺点

优点:

  • 封装性好: 备忘录模式将对象的状态封装在备忘录对象中,外部无法直接访问,保证了对象的封装性。
  • 易于扩展: 可以方便地增加新的备忘录类来保存不同的对象状态。
  • 简化原发器: 将状态保存和恢复的逻辑分离到备忘录类中,简化了原发器的代码。

缺点:

  • 资源消耗: 如果需要保存的对象状态很大,或者需要保存很多次状态,会消耗大量的内存资源。
  • 增加代码复杂度: 引入了新的类,增加了代码的复杂度。

五、总结

备忘录模式提供了一种优雅的方式来保存和恢复对象的状态,它在需要实现撤销、回滚、存档等功能时非常有用。但是,在使用备忘录模式时,也需要考虑其潜在的资源消耗和代码复杂度问题。


希望这篇博客能帮助你更好地理解和使用备忘录模式!

相关推荐
o0向阳而生0o2 小时前
28、.NET 中元数据是什么?
microsoft·c#·.net
niuTaylor3 小时前
Linux驱动开发快速上手指南:从理论到实战
linux·运维·开发语言·驱动开发·c#
军训猫猫头4 小时前
89.WPF 中实现便捷的数字输入框:DecimalUpDown 控件的使用 WPF例子 C#例子.
开发语言·c#·wpf
冰茶_5 小时前
.NET MAUI 发展历程:从 Xamarin 到现代跨平台应用开发框架
学习·microsoft·微软·c#·.net·xamarin
cooldream20096 小时前
深入理解MVP架构:让UI层与业务逻辑完美分离的设计模式
ui·设计模式·架构·系统架构师
The Future is mine6 小时前
C# new Bitmap(32043, 32043, PixelFormat.Format32bppArgb)报错:参数无效,如何将图像分块化处理?
开发语言·c#
摘星编程8 小时前
并发设计模式实战系列(3):工作队列
设计模式·并发编程
Pasregret9 小时前
访问者模式:分离数据结构与操作的设计模式
数据结构·设计模式·访问者模式
Aniugel11 小时前
JavaScript高级面试题
javascript·设计模式·面试
不当菜虚困12 小时前
JAVA设计模式——(四)门面模式
java·开发语言·设计模式