1.什么是备忘录模式?
根据他的名字来分析,我们就知道他是来保存一些状态的,当回滚的时候,就可以来进行返回,撤销等操作,就像我们coding的时候,写错了,要直接control + z来进行返回,当我们又不想破坏对象的原封装性,又要来存储,记录一些状态,怎么办?就像四五年前,我们做的萌三国之类的战旗一样,我们手动控制武将的移动,移动了一会我们反悔了怎么办?这样备忘录模式就能够游刃有余的给我们解决这一类的问题。
并且他是这么定义的:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态。他大致分为,发起人,备忘录,管理角色。
2.我们以最简单的例子入手来解析
我们先来创建一个发起人,也就是故事的主角。
/// <summary>
/// 备忘录方法 单状态
/// </summary>
public class Originator {
private string state = "";
public string State
{
set{
state = value;
}
get{
return state;
}
}
public Memento cteateMemento(){
return new Memento (this.State);
}
public void restoreMemento(Memento memento)
{
this.State = memento.State;
}
}
我们来创建一个备忘录
public class Memento{
private string state = "";
public Memento(string states)
{
state = states;
}
public string State
{
set{
state = value;
}
get{
return state;
}
}
}
我们来创建一个角色管理类public class Caretaker{
private Memento memento;
public Memento Mementos
{
set{
memento = value;
}
get{
return memento;
}
}
}
我们来进行测试。
public class Memorandum{
public void test()
{
Originator origintor = new Originator ();
origintor.State = "状态1";
Debug.Log ("初始化状态:" + origintor.State);
Caretaker caretaker = new Caretaker ();
caretaker.Mementos = origintor.cteateMemento ();
origintor.State = "状态2";
Debug.Log ("改变后的状态:" + origintor.State);
origintor.restoreMemento (caretaker.Mementos);
Debug.Log ("恢复后的状态:" + origintor.State);
}
}
3.需要注意的是。
由于要把需要撤销的变量进行单独保存一份,所以需要增加内存的消耗,在我们使用的时候就一定要注意了!