C# 语言 如何实现备忘录模式

C#阿木 发布于 2025-06-13 13 次阅读


备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不暴露对象内部细节的情况下保存和恢复对象之前的状态。在C中实现备忘录模式通常涉及以下步骤:

1. 定义备忘录(Memento):备忘录类负责存储对象的内部状态。
2. 定义原发器(Originator):原发器类负责创建备忘录对象并定义哪些状态需要被保存。
3. 定义管理者(Caretaker):管理者类负责保存备忘录对象,通常是一个栈或其他数据结构。

以下是一个简单的C示例,展示如何实现备忘录模式:

csharp
using System;
using System.Collections.Generic;

// 原发器类
public class Originator
{
private string state;

public string State
{
get { return state; }
set { state = value; }
}

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

// 恢复状态的方法
public void RestoreMemento(Memento memento)
{
state = memento.State;
}
}

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

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

public string State
{
get { return state; }
}
}

// 管理者类
public class Caretaker
{
private Stack mementoStack = new Stack();

// 添加备忘录到栈中
public void Add(Memento state)
{
mementoStack.Push(state);
}

// 从栈中获取备忘录
public Memento Get()
{
return mementoStack.Pop();
}
}

// 客户端代码
public class Program
{
public static void Main()
{
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();

// 原发器状态变化
originator.State = "State 1";
caretaker.Add(originator.CreateMemento());

originator.State = "State 2";
caretaker.Add(originator.CreateMemento());

originator.State = "State 3";
caretaker.Add(originator.CreateMemento());

// 恢复到备忘录状态
originator.RestoreMemento(caretaker.Get());
Console.WriteLine("Originator's State: " + originator.State);

originator.RestoreMemento(caretaker.Get());
Console.WriteLine("Originator's State: " + originator.State);
}
}

文章正文

备忘录模式在软件设计中是一种非常有用的模式,它允许我们保存对象的状态,以便在需要时恢复到之前的状态。在C中,我们可以通过定义三个类来实现备忘录模式:`Originator`(原发器)、`Memento`(备忘录)和`Caretaker`(管理者)。

原发器(Originator)

原发器类是备忘录模式的核心,它负责维护对象的状态。在上述代码中,`Originator`类有一个私有字段`state`来存储状态,以及`State`属性来获取和设置状态。`CreateMemento`方法用于创建一个新的备忘录对象,该对象包含当前状态的一个快照。`RestoreMemento`方法用于从备忘录中恢复状态。

备忘录(Memento)

备忘录类负责存储原发器的内部状态。它通常包含一个或多个字段来保存状态信息。在上述代码中,`Memento`类有一个私有字段`state`来存储状态,以及一个公共属性`State`来访问状态。

管理者(Caretaker)

管理者类负责保存备忘录对象。它通常使用一个栈或其他数据结构来存储备忘录对象,以便在需要时可以恢复到之前的状态。在上述代码中,`Caretaker`类有一个私有字段`mementoStack`来存储备忘录对象。`Add`方法用于将备忘录对象添加到栈中,而`Get`方法用于从栈中获取备忘录对象。

客户端代码

在客户端代码中,我们创建一个`Originator`对象和一个`Caretaker`对象。我们通过改变`Originator`对象的状态并调用`CreateMemento`方法来创建备忘录对象,并将这些备忘录对象存储在`Caretaker`对象中。当需要恢复到之前的状态时,我们可以从`Caretaker`对象中获取备忘录对象,并使用`RestoreMemento`方法恢复`Originator`对象的状态。

备忘录模式在软件设计中的应用非常广泛,例如在撤销/重做功能、事务管理、游戏保存和加载等场景中。通过使用备忘录模式,我们可以轻松地保存和恢复对象的状态,而无需担心对象的内部实现细节。

总结

备忘录模式是一种简单而强大的设计模式,它允许我们在不暴露对象内部细节的情况下保存和恢复对象的状态。在C中,通过定义原发器、备忘录和管理者三个类,我们可以轻松地实现备忘录模式。这种模式在软件设计中非常有用,特别是在需要撤销/重做功能或保存游戏状态等场景中。