目录
概述
备忘录模式是一种行为型设计模式,它可以捕获一个对象的内部状态,并在该对象不改变其状态的前提下,将该状态保存起来,以便以后恢复到原先的状态。备忘录模式可以使得对象的状态恢复更加灵活、方便,同时又不破坏对象的封装性。
备忘录模式通常包含三个角色:发起人、备忘录和负责人。发起人是需要保存状态的对象,它创建备忘录,并将自己的状态保存到备忘录中。备忘录是用于保存发起人的状态的对象,它可以被传递给负责人进行管理。负责人是用于管理备忘录的对象,它可以将备忘录存储起来或者恢复发起人的状态。
优点
备忘录模式的优点在于它可以使得对象的状态恢复更加灵活、方便,同时又不破坏对象的封装性。此外,备忘录模式还可以提高系统的可维护性和可扩展性,因为它将状态保存和恢复的处理分离开来,从而使得状态的修改和扩展更加容易。
缺点
备忘录模式的缺点在于它可能会导致代码的复杂度增加,因为它需要引入多个对象来实现状态的保存和恢复。此外,备忘录模式还可能会占用大量的内存空间,因为它需要保存多个备忘录对象来实现状态的多次恢复。
UML类图
下面是备忘录模式的UML类图:
在UML类图中,Originator是发起人,定义了一些操作来改变自己的状态,同时也定义了CreateMemento和RestoreMemento方法,用于创建备忘录和恢复状态。Memento是备忘录,用于保存发起人的状态。Caretaker是负责人,用于管理备忘录。客户端通过创建发起人和负责人对象,并通过发起人对象的操作改变了状态,并创建了备忘录。然后再次改变状态,并通过备忘录恢复了原先的状态。
示例代码
下面是备忘录模式的示例代码:
// 发起人
public class Originator
{
private string state;
public string State
{
get { return state; }
set
{
Console.WriteLine("Originator: Setting state to " + value);
state = value;
}
}
public Memento CreateMemento()
{
Console.WriteLine("Originator: Creating memento...");
return new Memento(state);
}
public void RestoreMemento(Memento memento)
{
Console.WriteLine("Originator: Restoring memento...");
state = memento.State;
}
}
// 备忘录
public class Memento
{
public string State { get; private set; }
public Memento(string state)
{
State = state;
}
}
// 负责人
public class Caretaker
{
private Memento memento;
public Memento Memento
{
get { return memento; }
set
{
Console.WriteLine("Caretaker: Saving state to memento...");
memento = value;
}
}
}
// 客户端
public class Client
{
static void Main()
{
Originator originator = new Originator();
Caretaker caretaker = new Caretaker();
originator.State = "State1";
Console.WriteLine("Current state: " + originator.State);
caretaker.Memento = originator.CreateMemento();
originator.State = "State2";
Console.WriteLine("Current state: " + originator.State);
originator.RestoreMemento(caretaker.Memento);
Console.WriteLine("Current state: " + originator.State);
}
}
在上面的示例代码中,Originator是发起人,定义了一些操作来改变自己的状态,同时也定义了CreateMemento和RestoreMemento方法,用于创建备忘录和恢复状态。Memento是备忘录,用于保存发起人的状态。Caretaker是负责人,用于管理备忘录。在客户端中,首先创建了发起人和负责人对象,然后通过发起人对象的操作改变了状态,并创建了备忘录。然后再次改变状态,并通过备忘录恢复了原先的状态。