备忘录模式定义
代码实现
/// <summary>
/// 魔兽争霸
/// </summary>
public class War3
{
public string Race { get; set; }
public string Hero { get; set; }
public string Army { get; set; }
public string Resource { get; set; }
public void Show()
{
Console.WriteLine("********************************");
Console.WriteLine(" Race:{0}", this.Race);
Console.WriteLine(" Hero:{0}", this.Hero);
Console.WriteLine(" Army:{0}", this.Army);
Console.WriteLine("Resource:{0}", this.Resource);
Console.WriteLine("********************************");
}
public void Save(string name)
{
War3Memento memento = new War3Memento(this.Hero, this.Army, this.Resource);
Caretaker.SaveWar3Memento(name, memento);
}
public void Load(string name)
{
War3Memento memento = Caretaker.GetWar3Memento(name);
this.Army = memento.Army;
this.Hero = memento.Hero;
this.Resource = memento.Resource;
}
}
备忘类,备忘War3中的部分属性。
/// <summary>
/// 魔兽争霸备忘
/// </summary>
public class War3Memento
{
public string Hero { get; private set; }
public string Army { get; private set; }
public string Resource { get; private set; }
public War3Memento(string hero, string army, string resource)
{
this.Hero = hero;
this.Army = army;
this.Resource = resource;
}
}
缓存类,使用容器进行缓存:
/// <summary>
/// 第三方保存容器:txt xml db 缓存 内存
/// </summary>
public class Caretaker
{
private static Dictionary<string, War3Memento> _War3MementoDictionary = new Dictionary<string, War3Memento>();
public static void SaveWar3Memento(string name, War3Memento war3Memento)
{
_War3MementoDictionary.Add(name, war3Memento);
}
public static War3Memento GetWar3Memento(string name)
{
if (_War3MementoDictionary.ContainsKey(name))
return _War3MementoDictionary[name];
else
throw new Exception("wrong name");
}
}
调用方代码如下:
War3 war3 = new War3()
{
Race = "Undead",
Hero = "Level 1 DK",
Army = "5只食尸鬼",
Resource = "200G 200W"
};
war3.Save("Start");
war3.Show();
Console.WriteLine("*****MF*******");
war3.Hero = "3级DK1级Lich";
war3.Army = "5只蜘蛛2只食尸鬼";
war3.Resource = "500G 300W";
war3.Save("MF");
war3.Show();
Console.WriteLine("*****交战*******");
war3.Hero = "4级DK 3级Lich 1级小强";
war3.Army = "1只憎恶6只蜘蛛1只雕像";
war3.Resource = "1000G 1500W";
war3.Save("交战");
Console.WriteLine("*****决战*******");
war3.Hero = "5级DK 4级Lich 3级小强";
war3.Army = "2只憎恶8只蜘蛛2只雕像";
war3.Resource = "1000G 1500W";
war3.Save("决战");
Console.WriteLine("*****决战后*******");
war3.Hero = "6级DK 6级Lich 3级小强";
war3.Army = "1只憎恶2只蜘蛛1只冰龙";
war3.Resource = "10G 1200W";
war3.Save("决战后");
war3.Load("Start");
war3.Show();
war3.Load("MF");
war3.Show();
war3.Load("交战");
war3.Show();
war3.Load("决战");
war3.Show();
war3.Load("决战后");
war3.Show();
要点总结
备忘录模式主要思想是——利用备忘录对象来对保存发起人的内部状态,当发起人需要恢复原来状态时,再从备忘录对象中进行获取,在实际开发过程也应用到这点,例如数据库中的事务处理。
备忘录模式的适用场景:
如果系统需要提供回滚操作时,使用备忘录模式非常合适。例如文本编辑器的Ctrl+Z撤销操作的实现,数据库中事务操作。
备忘录模式的优缺点
优点:
如果某个操作错误地破坏了数据的完整性,此时可以使用备忘录模式将数据恢复成原来正确的数据。
备份的状态数据保存在发起人角色之外,这样发起人就不需要对各个备份的状态进行管理。而是由备忘录角色进行管理,而备忘录角色又是由管理者角色管理,符合单一职责原则。
缺点:
在实际的系统中,可能需要维护多个备份,需要额外的资源,这样对资源的消耗比较严重。