备忘录模式简介
在不破坏封装型的前提下,捕获一个对象内部的状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原来保存的状态。
使用场景: 使用户可以取消不确定或错误的操作,恢复到原来的状态
- 游戏存档
- 回滚操作
- 保存/恢复数据
C# 备忘录模式Demo
using System;
namespace MementoPattern
{
class Program
{
static void Main(string[] args)
{
Originator originator = new Originator() { State = "张三", State1 = "89分" };
Console.WriteLine("原 始 值: {0} {1}", originator.State, originator.State1);
Caretaker caretaker = new Caretaker() { memento = originator.CreateMemento() };
// 修改State
originator.State = "李四";
Console.WriteLine("修改后的值: {0} {1}", originator.State, originator.State1);
// 恢复State
originator.RecoveryMemento(caretaker.memento);
Console.WriteLine("恢复后的值: {0} {1}", originator.State, originator.State1);
}
}
/// <summary>
/// 发起者
/// </summary>
public class Originator
{
/// <summary>
/// 需要备份的数据
/// </summary>
public string State
{
get; set;
}
/// <summary>
/// 无需备份的数据 若Originator的所有数据都需要备份 , 就等同克隆
/// </summary>
public string State1
{
get; set;
}
public Memento CreateMemento()
{
return new Memento() { State = this.State};
}
public void RecoveryMemento(Memento memento)
{
this.State = memento.State;
}
}
/// <summary>
/// 需要恢复的对象的状态
/// </summary>
public class Memento
{
public string State
{
get; set;
}
}
/// <summary>
/// 管理memento
/// Caretaker 保存多个备忘录 可以用一个 List<memento> 来保存
/// </summary>
public class Caretaker
{
public Memento memento
{
get; set;
}
}
}
测试结果: