设计模式(22)---备忘录模式

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

基本定义

备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。

解释:简单来说,就是保存一个对象在某一时刻的特定状态,在以后需要的时候可以将对象恢复到保存时的状态。

基本代码:

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

备忘录模式的优缺点及适用场景:

优点:

为用户提供一种可以恢复状态的机制,用户比较方便的恢复到某个历史状态。

隐藏恢复细节,用户不需要关心状态的保存细节。

缺点:

对象状态需要完整存储到备忘录对象中,如果状态数据很大,那么在资源消耗上,备忘录对象会非常耗内存。

适用场景:

简单来说,显现其优点回避其缺点的地方都可以使用备忘录模式。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航