在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` 类的内部实现细节的情况下,保存和恢复状态。