设计模式--备忘录模式

2023-07-22 19:17:06 浏览数 (1)

备忘录模式(Memento Pattern)是一种行为设计模式,其目的是在不破坏对象封装性的前提下,捕获并外部保存对象的状态,并在日后将该对象状态恢复到之前的某个状态。

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

  • Originator:原发器,创建需要存储的备忘录对象,以保存对象的状态。
  • Memento:备忘录,保存原发器状态的对象。
  • Caretaker:管理者,负责保存和恢复备忘录。在没有访问备忘录内部状态的前提下负责保护备忘录。

以下是一个使用C#编写的备忘录模式的经典代码实例。实例中,我们使用备忘录模式记录一个数字的历史状态,并支持撤销到之前的某个状态。

代码语言:javascript复制
// 备忘录类,用于保存数字状态
public class NumberMemento
{
    private int _value;

    public NumberMemento(int value)
    {
        _value = value;
    }

    public int GetValue()
    {
        return _value;
    }
}

// 原发器类,用于创建备忘录和恢复备忘录
public class Number
{
    private int _value;

    public int GetValue()
    {
        return _value;
    }

    public void SetValue(int value)
    {
        _value = value;
    }

    // 创建备忘录
    public NumberMemento Save()
    {
        return new NumberMemento(_value);
    }

    // 恢复备忘录
    public void Restore(NumberMemento memento)
    {
        _value = memento.GetValue();
    }
}

// 管理者类,用于保存和恢复备忘录
public class History
{
    private Stack<NumberMemento> _mementos = new Stack<NumberMemento>();

    public void PushMemento(NumberMemento memento)
    {
        _mementos.Push(memento);
    }

    public NumberMemento PopMemento()
    {
        return _mementos.Pop();
    }
}

// 示例代码
var number = new Number();
var history = new History();

number.SetValue(10);
history.PushMemento(number.Save());

number.SetValue(20);
history.PushMemento(number.Save());

number.SetValue(30);

// 当前值为30
Console.WriteLine($"Current value: {number.GetValue()}");

// 撤销到前一步,值为20
number.Restore(history.PopMemento());
Console.WriteLine($"Current value: {number.GetValue()}");

// 撤销到再前一步,值为10
number.Restore(history.PopMemento());
Console.WriteLine($"Current value: {number.GetValue()}");

输出:

代码语言:javascript复制
Current value: 30
Current value: 20
Current value: 10

【代码分析】

在这个示例中,我们使用Number类表示一个数字,并且使用NumberMemento类表示数字的备忘录。History类则表示备忘录的管理者,包含一个Stack用于保存备忘录对象。通过这个例子,我们可以看到如何使用备忘录模式来记录对象的历史状态,并支持恢复到之前的某个状态。

0 人点赞