c# 备忘录模式


在C#中实现备忘录模式(Memento Pattern)主要是用于在不破坏封装性的前提下,捕获一个对象的内部状态,并在将来的某个时刻将该对象恢复到原先保存的状态。备忘录模式涉及三个主要角色:

1. **发起人(Originator)**:记录当前时刻的内部状态,负责创建一个备忘录(Memento),用以记录当前时刻的状态,并使用备忘录数据来恢复内部状态。

2. **备忘录(Memento)**:负责存储发起人(Originator)的内部状态,并防止发起人以外的其他对象访问备忘录。备忘录有两个接口:Caretaker只能看到备忘录的窄接口,也就是状态不允许对象直接访问备忘录内容;Originator可以访问宽接口,以便它可以恢复自己的状态。

3. **管理者(Caretaker)**:负责保存备忘录对象,不检查备忘录对象的内容,也无权对备忘录对象进行操作或检查其内容。

以下是一个简单的C#实现示例:


using System;

// 备忘录
public class Memento
{
    private string state;

    public Memento(string state)
    {
        this.state = state;
    }

    public string GetState()
    {
        return state;
    }
}

// 发起人
public class Originator
{
    private string state;

    public void SetState(string state)
    {
        this.state = state;
    }

    public string GetState()
    {
        return state;
    }

    // 创建备忘录
    public Memento CreateMemento()
    {
        return new Memento(state);
    }

    // 恢复状态
    public void RestoreMemento(Memento memento)
    {
        this.state = memento.GetState();
    }
}

// 管理者
public class Caretaker
{
    private Memento memento;

    public void SetMemento(Memento memento)
    {
        this.memento = memento;
    }

    public Memento GetMemento()
    {
        return memento;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();

        originator.SetState("On");
        caretaker.SetMemento(originator.CreateMemento());

        originator.SetState("Off");
        Console.WriteLine("Current State: " + originator.GetState()); // Off

        originator.RestoreMemento(caretaker.GetMemento());
        Console.WriteLine("State after restoring: " + originator.GetState()); // On
    }
}

这个示例中,`Originator` 类可以保存和恢复其内部状态,通过创建 `Memento` 对象来记录当前状态,并允许通过 `Caretaker` 类来管理这些状态对象。通过这种方式,可以在不暴露 `Originator` 类的内部实现细节的情况下,保存和恢复状态。