设计模式之备忘录模式 Memento Pattern
V1.0
核心概念
备忘录模式的核心是定义一个备忘录类(Memento),这个类的实例能够表示发起人类(Originator)的一种状态。发起人类提供生成备忘录对象的接口,以保存其当时的状态,也提供了接口传入备忘录实例,能够使用备忘录对象实例中保存的信息恢复其保存时的状态。
角色
- 发起人(Originator):具体的业务类,提供生成备忘录的接口,也提供使用备忘录对象来恢复状态的接口。
- 备忘录(Memento):由发起人根据其状态创建,保存了发起人创建时的状态信息,之后可以用来恢复发起人的状态。
- 管理者(Caretaker):用于保存备忘录对象,以及在向其查询时提供备忘录对象。
代码示例
csharp
using System;
using System.ComponentModel;
public class Originator
{
private string _state = null;
public string state
{
get => _state;
set => _state = value;
}
public Memento createMemento()
{
return new Memento(state);
}
public void setState(string state)
{
this.state = state;
}
public void recoverFromMemento(Memento m)
{
state = m.state;
Console.WriteLine($"The state of the originator is restored to '{state}'");
}
public void displayState()
{
Console.WriteLine($"The state of the originator now: {state}");
}
};
public class Memento
{
private string _state;
public string state
{
get => _state;
set => _state = value;
}
public Memento(string state)
{
this.state = state;
}
};
public class Caretaker
{
private List<Memento> list = new();
public void addMemento(Memento m)
{
list.Add(m);
}
public Memento getMemento(int index)
{
return list.Count > index ? list[index] : null;
}
}
public class Program
{
public static void Main(string[] arg)
{
//创建发起人和管理者
Originator o = new();
Caretaker ct = new();
//设置发起人的状态,展示并保存为Memento对象到管理者
o.setState("Idle");
o.displayState();
ct.addMemento(o.createMemento());
//设置发起人的状态,展示并保存为Memento对象到管理者
o.setState("Working");
o.displayState();
ct.addMemento(o.createMemento());
//设置发起人的状态,展示并保存为Memento对象到管理者
o.setState("Stop");
o.displayState();
ct.addMemento(o.createMemento());
//恢复Originator的状态到Idle状态
o.recoverFromMemento(ct.getMemento(0));
o.displayState();
//恢复Originator的状态到Working状态
o.recoverFromMemento(ct.getMemento(1));
o.displayState();
}
}
程序运行结果
The state of the originator now: Idle
The state of the originator now: Working
The state of the originator now: Stop
The state of the originator is restored to 'Idle'
The state of the originator now: Idle
The state of the originator is restored to 'Working'
The state of the originator now: Working
代码讲解
-
Originator类
在这段代码中,Originator类的state属性是Originator类的状态,Originator类也提供了创建备忘录对象的createMemento方法,从备忘录对象中恢复状态的recoverFromMemento方法,以及展示Originator类当前状态的方法displayState。
-
Memento类
Memento类中的state属性用来保存对应的Originator的状态,在Originator恢复状态时要用到。
-
Caretaker类
Caretaker类定义了private访问权限的list列表,用于保存Memento对象,提供了addMemento方法用来向list列表中新增Memento对象,以及getMemento方法用于从list列表中获取指定序号的Memento对象。
-
Program类
Main函数中创建了发起人和管理者,变更发起人的状态,以及展示并保存Memento对象,之后从管理者中获取Memento对象,以恢复发起人的状态。
适用场景
备忘录模式可以用来保存快照的场景中,例如程序或者虚拟机的快照。
备忘录模式也可以用在撤销或恢复状态的场景中,通过保存当前的状态,在撤消操作时可以使用备忘录对象恢复之前的状态。