设计模式 - 备忘录模式

概述

备忘录模式(Memento Pattern)是一种行为型设计模式,它在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后可以将对象恢复到之前的状态。备忘录模式通过保存对象的状态,使得对象可以在需要时恢复到之前的状态,从而实现撤销操作。

结构

备忘录模式包含以下几个角色:

  1. 备忘录(Memento):存储原发器对象的内部状态,并防止其他对象访问备忘录。
  2. 原发器(Originator):创建一个备忘录对象,用以记录当前时刻的内部状态,并可以使用备忘录对象恢复内部状态。
  3. 负责人(Caretaker):负责保存备忘录对象,但不能对备忘录的内容进行操作或检查。

示例代码

假设我们有一个应用程序需要保存和恢复文本编辑器的状态。
代码地址

备忘录

public class TextEditorMemento
{
    public string Text { get; private set; }

    public TextEditorMemento(string text)
    {
        Text = text;
    }
}

原发器

public class TextEditor
{
    public string Text { get; set; }

    public TextEditorMemento Save()
    {
        return new TextEditorMemento(Text);
    }

    public void Restore(TextEditorMemento memento)
    {
        Text = memento.Text;
    }
}

负责人

public class TextEditorCaretaker
{
    private Stack<TextEditorMemento> _mementos = new Stack<TextEditorMemento>();

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

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

客户端代码

class Program
{
    static void Main(string[] args)
    {
        TextEditor editor = new TextEditor();
        TextEditorCaretaker caretaker = new TextEditorCaretaker();

        editor.Text = "Hello, World!";
        caretaker.SaveState(editor);

        editor.Text = "Hello, Design Patterns!";
        caretaker.SaveState(editor);

        Console.WriteLine("Current Text: " + editor.Text);

        caretaker.RestoreState(editor);
        Console.WriteLine("Restored Text: " + editor.Text);

        caretaker.RestoreState(editor);
        Console.WriteLine("Restored Text: " + editor.Text);
    }
}

应用场景

备忘录模式适用于以下场景:

  1. 需要保存和恢复对象状态:当需要保存和恢复对象的状态时,可以使用备忘录模式。
  2. 实现撤销操作:当需要实现撤销操作时,可以使用备忘录模式。
  3. 避免暴露对象的内部状态:当需要避免暴露对象的内部状态时,可以使用备忘录模式。

优缺点

优点

  • 保持封装性:备忘录模式通过保存对象的状态,保持了对象的封装性,避免了暴露对象的内部状态。
  • 实现撤销操作:备忘录模式可以很容易地实现撤销操作,使得对象可以恢复到之前的状态。

缺点

  • 增加内存开销:备忘录模式需要保存对象的状态,可能会增加内存开销,特别是当对象的状态较多时。
  • 实现复杂性:备忘录模式的实现可能会比较复杂,特别是当对象的状态较多时。
posted @ 2025-01-03 16:08  贾光辉  阅读(13)  评论(0编辑  收藏  举报