意图
在不破坏封装性的前提条件下,捕获一个对象的内部状态,然后在该对象之外保存这个状态。以后在需要的时候可以将该对象恢复到原先保存的状态。
结构
1.Memento
(备忘录):保存
Originator
(原发器)对象的内部状态,
Originator
根据需要决定保存哪些内部状态,防止自身以外的其它对象访问备忘录。备忘录实际上是由两个接口,其中
Caretaker
(管理者)只能看到备忘录的窄接口,即它只能将备忘录传递给其他对象;而原发器可以看到一个宽接口,允许他访问回到原先状态所需的所有数据,理想的情况是只允许生成原发器访问本备忘录的内部状态。
2.Originator
:创建一个备忘录以记录当前时刻内部状态,使用备忘录恢复内部状态。
3.Caretaker
:负责保存备忘录,但不能处理其中的内容。
使用场合
需要保存对象在某一时刻的状态,并在以后需要的时候恢复到这个状态。同时又不希望暴露对象的视线细节,破坏对象的封装性,这时需要使用备忘录模式。
效果
备忘录模式在不破坏封装性的前提下,实现对对象内部状态的外部保存。但如果保存的状态过多,或者设计不合理,则将产生过多的备忘录对象而占用大量的系统资源。
using System;
namespace MyApp
{
class Program
{
static void Main()
{
GameRole gameRole = new GameRole ( "Killer007" );
gameRole.ShowState();
gameRole.HitBoss();
gameRole.HitBoss();
gameRole.Hitted();
gameRole.ShowState();
gameRole.SetMemento();
gameRole.Hitted();
gameRole.Hitted();
gameRole.Hitted();
gameRole.Hitted();
gameRole.ShowState();
gameRole.GetMemento();
gameRole.ShowState();
Console .ReadKey();
}
}
class GameRole
{
private string account;
private int blood;
private int magic;
private Memento memento;
public GameRole( string account)
{
this .account = account;
blood = 100 ;
magic = 100 ;
}
public void SetMemento()
{
this .memento = new Memento (blood, magic);
}
public void GetMemento()
{
this .blood = memento.Blood;
this .magic = memento.Magic;
}
public void HitBoss()
{
magic -= 20 ;
}
public void Hitted()
{
blood -= 20 ;
}
public void ShowState()
{
Console .WriteLine( "Account:{0}" , account);
Console .WriteLine( " Blood:{0}" , blood.ToString());
Console .WriteLine( " Magic:{0}" , magic.ToString());
Console .WriteLine();
}
}
class Memento
{
private int blood;
private int magic;
public int Blood
{
get
{
return blood;
}
}
public int Magic
{
get
{
return magic;
}
}
public Memento( int blood, int magic)
{
this .blood = blood;
this .magic = magic;
}
}
}