Definición del modo Memento (Memento) : bajo la premisa de no destruir el encapsulado, capturar el estado interno de un objeto y guardar este estado fuera del objeto. De esta forma, el objeto se puede restaurar a su estado original en el futuro. Este modo también se denomina modo de instantánea.
Escenario de uso :
- Al usar el modo de comando, debe realizar la cancelación del comando
- Restaurar un estado incorrecto o no válido
Estructura :
- Rol del originador: registra la información del estado interno actual, proporciona las funciones de creación de notas y restauración de datos de notas, y realiza otras funciones comerciales. Puede acceder a toda la información en la nota.
- Función de recuerdo: responsable de almacenar el estado interno del iniciador y proporcionar estos estados internos al iniciador cuando sea necesario.
- Rol de administrador (cuidador): administra notas, proporciona las funciones de guardar y obtener notas, pero no pueden acceder ni modificar el contenido de las notas.
Inicia la humanidad:
class Originator //发起人类
{
private string state;
public string State//状态,可读可写
{
get {
return state; }
set {
state = value; }
}
public Memento CreateMemento()//创建备忘录
{
return (new Memento(state));//返回创建的备忘录实例,这个实例是有状态的
}
public void SetMemento(Memento memento)//恢复备忘录,将备忘录导入并将相关数据恢复
{
state = memento.State;
}
public void Show()//显示数据
{
Console.WriteLine("State="+state); }
}
Categoría de nota:
class Memento //备忘录类
{
private string state;
public Memento(string state)//构造方法
{
this.state = state;
}
public string State//只读,需要保存的状态
{
get {
return state; }
}
}
Clase de administrador:
class Caretaker //管理者类
{
private Memento memento;
public Memento Memento //得到或设置备忘录
{
get {
return memento; }
set {
memento = value;}
}
}
Cliente:
static void Main(string[] args)
{
Originator o = new Originator();
o.State = "On";
o.Show();
//保存状态时,由于进行了封装,可以隐藏Originator的实现细节
Caretaker c = new Caretaker();
c.Memento = o.CreateMemento();//创建状态为On的备忘录实例,并赋给Memento属性
o.State = "Off";
o.Show();
o.SetMemento(c.Memento);
o.Show();
Console.Read();
}