基本定义
备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
解释:简单来说,就是保存一个对象在某一时刻的特定状态,在以后需要的时候可以将对象恢复到保存时的状态。
基本代码:
classOriginator
{PRivatestringstate;publicstringState
{get{returnstate; }set{ state =value; }
}publicMemento CreateMemento()
{returnnewMemento(state);
}publicvoidSetMemento(Memento memento)
{
state=memento.State;
}publicvoidDisplay()
{
Console.WriteLine("State="+state);
}
}classMemento
{privatestringstate;publicstringState
{get{returnstate; }
}publicMemento(stringstate)
{this.state =state;
}
}classCaretaker
{privateMemento memento1;publicMemento Memento1
{get{returnmemento1; }set{ memento1 =value; }
}
}
classOriginator
{privatestringstate;publicstringState
{get{returnstate; }set{ state =value; }
}publicMemento CreateMemento()
{returnnewMemento(state);
}publicvoidSetMemento(Memento memento)
{
state=memento.State;
}publicvoidDisplay()
{
Console.WriteLine("State="+state);
}
}classMemento
{privatestringstate;publicstringState
{get{returnstate; }
}publicMemento(stringstate)
{this.state =state;
}
}classCaretaker
{privateMemento memento1;publicMemento Memento1
{get{returnmemento1; }set{ memento1 =value; }
}
}
客户端调用:
Originator originator =newOriginator();
originator.State="on";
originator.Display();
Caretaker caretaker=newCaretaker();
caretaker.Memento1=originator.CreateMemento();
originator.State="off";
originator.Display();
originator.SetMemento(caretaker.Memento1);
originator.Display();
View Code
列举具体实例:
打游戏,保存一角色在打boss前的状态,待打boss结束后再恢复到它之前的状态。
classProgram
{staticvoidMain(string[] args)
{
Role role=newRole(100,100);
Console.WriteLine("大战前:");
role.Display();
Caretaker caretaker=newCaretaker();
caretaker.memento=role.SaveMemento();
role.SetBloodFlow(20);
role.SetMagicPoint(20);
Console.WriteLine("大战");
role.Display();
role.RestoreMemento(caretaker.GetMemento());
Console.WriteLine("恢复");
role.Display();
Console.Read();
}
}classRole
{privateintbloodFlow;privateintmagicPoint;publicRole(intbloodFlow,intmagicPoint)
{this.bloodFlow =bloodFlow;this.magicPoint =magicPoint;
}publicintGetBloodFlow()
{returnbloodFlow;
}publicvoidSetBloodFlow(intbloodFlow)
{this.bloodFlow =bloodFlow;
}publicintGetMagicPoint()
{returnmagicPoint;
}publicvoidSetMagicPoint(intmagicPoint)
{this.magicPoint =magicPoint;
}publicvoidDisplay()
{
Console.WriteLine("用户当前的状态:");
Console.WriteLine("血量:"+ GetBloodFlow() +";蓝量:"+GetMagicPoint());
}publicMemento SaveMemento()
{returnnewMemento(GetBloodFlow (),GetMagicPoint ());
}publicvoidRestoreMemento(Memento memento)
{this.bloodFlow =memento.GetBloodFlow();this.magicPoint =memento.GetMagicPoint();
}
}classMemento
{privateintbloodFlow;privateintmagicPoint;publicMemento(intbloodFlow,intmagicPoint)
{this.bloodFlow =bloodFlow;this.magicPoint =magicPoint;
}publicintGetBloodFlow()
{returnbloodFlow;
}publicvoidSetBloodFlow(intbloodFlow)
{this.bloodFlow =bloodFlow;
}publicintGetMagicPoint()
{returnmagicPoint;
}publicvoidSetMagicPoint(intmagicPoint)
{this.magicPoint =magicPoint;
}
}classCaretaker
{publicMemento memento;publicMemento GetMemento()
{returnmemento;
}publicvoidSetMemento(Memento memento)
{this.memento =memento;
}
}
View Code
备忘录模式的优缺点及适用场景:
优点:
为用户提供一种可以恢复状态的机制,用户比较方便的恢复到某个历史状态。
隐藏恢复细节,用户不需要关心状态的保存细节。
缺点:
对象状态需要完整存储到备忘录对象中,如果状态数据很大,那么在资源消耗上,备忘录对象会非常耗内存。
适用场景:
简单来说,显现其优点回避其缺点的地方都可以使用备忘录模式。