基本定义ide
备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象以外保存这个状态。这样之后就能够将该对象恢复到原先保存的状态。this
解释:简单来讲,就是保存一个对象在某一时刻的特定状态,在之后须要的时候能够将对象恢复到保存时的状态。spa
基本代码:code
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 Display() { Console.WriteLine("State=" + state); } } class Memento { private string state; public string State { get { return state; } } public Memento(string state) { this.state = state; } } class Caretaker { private Memento memento1; public Memento Memento1 { get { return memento1; } set { memento1 = value; } } }
客户端调用:对象
Originator originator = new Originator(); originator.State = "on"; originator.Display(); Caretaker caretaker = new Caretaker(); caretaker.Memento1 = originator.CreateMemento(); originator.State = "off"; originator.Display(); originator.SetMemento(caretaker.Memento1); originator.Display();
列举具体实例:blog
打游戏,保存一角色在打boss前的状态,待打boss结束后再恢复到它以前的状态。游戏
class Program { static void Main(string[] args) { Role role = new Role(100, 100); Console.WriteLine("大战前:"); role.Display(); Caretaker caretaker = new Caretaker(); caretaker.memento = role.SaveMemento(); role.SetBloodFlow(20); role.SetMagicPoint(20); Console.WriteLine("大战"); role.Display(); role.RestoreMemento(caretaker.GetMemento()); Console.WriteLine("恢复"); role.Display(); Console.Read(); } } class Role { private int bloodFlow; private int magicPoint; public Role(int bloodFlow, int magicPoint) { this.bloodFlow = bloodFlow; this.magicPoint = magicPoint; } public int GetBloodFlow() { return bloodFlow; } public void SetBloodFlow(int bloodFlow) { this.bloodFlow = bloodFlow; } public int GetMagicPoint() { return magicPoint; } public void SetMagicPoint(int magicPoint) { this.magicPoint = magicPoint; } public void Display() { Console.WriteLine("用户当前的状态:"); Console.WriteLine("血量:" + GetBloodFlow() + ";蓝量:" + GetMagicPoint()); } public Memento SaveMemento() { return new Memento(GetBloodFlow (),GetMagicPoint ()); } public void RestoreMemento(Memento memento) { this.bloodFlow = memento.GetBloodFlow(); this.magicPoint = memento.GetMagicPoint(); } } class Memento { private int bloodFlow; private int magicPoint; public Memento(int bloodFlow, int magicPoint) { this.bloodFlow = bloodFlow; this.magicPoint = magicPoint; } public int GetBloodFlow() { return bloodFlow; } public void SetBloodFlow(int bloodFlow) { this.bloodFlow = bloodFlow; } public int GetMagicPoint() { return magicPoint; } public void SetMagicPoint(int magicPoint) { this.magicPoint = magicPoint; } } class Caretaker { public Memento memento; public Memento GetMemento() { return memento; } public void SetMemento(Memento memento) { this.memento = memento; } }
备忘录模式的优缺点及适用场景:内存
优势:资源
为用户提供一种能够恢复状态的机制,用户比较方便的恢复到某个历史状态。get
隐藏恢复细节,用户不须要关心状态的保存细节。
缺点:
对象状态须要完整存储到备忘录对象中,若是状态数据很大,那么在资源消耗上,备忘录对象会很是耗内存。
适用场景:
简单来讲,显现其优势回避其缺点的地方均可以使用备忘录模式。