类关系图
![]()
类角色说明
1) 备忘录(Memento)角色:备忘录角色存储“备忘发起角色”的内部状态。“备忘发起角色”根据需要决定备忘录角色存储“备忘发起角色”的哪些内部状态。为了防止“备忘发起角色”以外的其他对象访问备忘录。备忘录实际上有两个接口,“备忘录管理者角色”只能看到备忘录提供的窄接口——对于备忘录角色中存放的属性是不可见的。“备忘发起角色”则能够看到一个宽接口——能够得到自己放入备忘录角色中属性。
2) 备忘发起(Originator)角色:“备忘发起角色”创建一个备忘录,用以记录当前时刻它的内部状态。在需要时使用备忘录恢复内部状态。
3) 备忘录管理者(Caretaker)角色:负责保存好备忘录。不能对备忘录的内容进行操作或检查
意图
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
适用性
1、必须保存一个对象在某一个时刻的(部分)状态, 这样以后需要时它才能恢复到先前的状态。
2、如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。
泡妞的例子
同时跟几个MM聊天时,一定要记清楚刚才跟MM说了些什么话,不然MM发现了会不高兴的哦,幸亏我有个备忘录,刚才与哪个MM说了什么话我都拷贝一份放到备忘录里面保存,这样可以随时察看以前的记录啦。
泡妞的代码
using System;
using System.Collections;
public interface IDialog
{
string Words{get;}
IDialog Clone();
}
![]()
public class Dialog:IDialog
{
private string words="";
public string Words
{
get{return words;}
set{words=value;}
}
public Dialog(string thewords)
{
words=thewords;
}
public IDialog Clone()
{
Dialog dialog=new Dialog(this.words);
return dialog;
}
}
public class MM
{
private string name;
private Dialog dialog;
public IDialog Dialog
{
get{return dialog;}
}
public MM(string name)
{
this.name=name;
}
public void Say(string thewords)
{
dialog=new Dialog(thewords);
Console.WriteLine(name+" say:"+dialog.Words);
}
public void ReSay(IDialog thedialog)
{
Dialog dia=thedialog as Dialog;
dialog.Words=dia.Words;
Console.WriteLine(name+" has saied:"+dialog.Words);
}
}
![]()
public class Memo
{
private ArrayList list=new ArrayList();
public void Add(IDialog dialog)
{
list.Add(dialog);
}
public void Remove(IDialog dialog)
{
list.Remove(dialog);
}
public IDialog GetDialog(int index)
{
if(list.Count>index)
{
return list[index] as IDialog;
}
else
{
return new Dialog("nothing!");
}
}
}
![]()
public class MyClass
{
public static void Main()
{
Memo mymemo=new Memo();
MM Lily=new MM("Lily");
Lily.Say("明年我们就要结婚了!");
mymemo.Add(Lily.Dialog.Clone());
Lily.Say("我爸说要200万的聘礼,否则你别想娶我过门!");
mymemo.Add(Lily.Dialog.Clone());
Lily.Say("我妈说在深圳,没有200平米的房子,也别想娶我过门!");
mymemo.Add(Lily.Dialog.Clone());
Lily.ReSay(mymemo.GetDialog(2));
Lily.ReSay(mymemo.GetDialog(1));
Lily.ReSay(mymemo.GetDialog(0));
Lily.ReSay(mymemo.GetDialog(2));
}
Helper methods
}
备忘录模式
备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。
备注
管理者对象向原发器对象请求一个备忘录对象,此时管理这负责暂时保存备忘录。如果原发器需要恢复原来的状态,管理者就吧自己的备忘录传回给它。备忘录对象是被动的,只有创建备忘录的原发器会对它的状态进行赋值和检索。
类角色说明
1) 备忘录(Memento)角色:备忘录角色存储“备忘发起角色”的内部状态。“备忘发起角色”根据需要决定备忘录角色存储“备忘发起角色”的哪些内部状态。为了防止“备忘发起角色”以外的其他对象访问备忘录。备忘录实际上有两个接口,“备忘录管理者角色”只能看到备忘录提供的窄接口——对于备忘录角色中存放的属性是不可见的。“备忘发起角色”则能够看到一个宽接口——能够得到自己放入备忘录角色中属性。
2) 备忘发起(Originator)角色:“备忘发起角色”创建一个备忘录,用以记录当前时刻它的内部状态。在需要时使用备忘录恢复内部状态。
3) 备忘录管理者(Caretaker)角色:负责保存好备忘录。不能对备忘录的内容进行操作或检查
意图
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
适用性
1、必须保存一个对象在某一个时刻的(部分)状态, 这样以后需要时它才能恢复到先前的状态。
2、如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。
泡妞的例子
同时跟几个MM聊天时,一定要记清楚刚才跟MM说了些什么话,不然MM发现了会不高兴的哦,幸亏我有个备忘录,刚才与哪个MM说了什么话我都拷贝一份放到备忘录里面保存,这样可以随时察看以前的记录啦。
泡妞的代码
using System;
using System.Collections;
public interface IDialog
{
string Words{get;}
IDialog Clone();
}
public class Dialog:IDialog
{
private string words="";
public string Words
{
get{return words;}
set{words=value;}
}
public Dialog(string thewords)
{
words=thewords;
}
public IDialog Clone()
{
Dialog dialog=new Dialog(this.words);
return dialog;
}
}
public class MM
{
private string name;
private Dialog dialog;
public IDialog Dialog
{
get{return dialog;}
}
public MM(string name)
{
this.name=name;
}
public void Say(string thewords)
{
dialog=new Dialog(thewords);
Console.WriteLine(name+" say:"+dialog.Words);
}
public void ReSay(IDialog thedialog)
{
Dialog dia=thedialog as Dialog;
dialog.Words=dia.Words;
Console.WriteLine(name+" has saied:"+dialog.Words);
}
}
public class Memo
{
private ArrayList list=new ArrayList();
public void Add(IDialog dialog)
{
list.Add(dialog);
}
public void Remove(IDialog dialog)
{
list.Remove(dialog);
}
public IDialog GetDialog(int index)
{
if(list.Count>index)
{
return list[index] as IDialog;
}
else
{
return new Dialog("nothing!");
}
}
}
public class MyClass
{
public static void Main()
{
Memo mymemo=new Memo();
MM Lily=new MM("Lily");
Lily.Say("明年我们就要结婚了!");
mymemo.Add(Lily.Dialog.Clone());
Lily.Say("我爸说要200万的聘礼,否则你别想娶我过门!");
mymemo.Add(Lily.Dialog.Clone());
Lily.Say("我妈说在深圳,没有200平米的房子,也别想娶我过门!");
mymemo.Add(Lily.Dialog.Clone());
Lily.ReSay(mymemo.GetDialog(2));
Lily.ReSay(mymemo.GetDialog(1));
Lily.ReSay(mymemo.GetDialog(0));
Lily.ReSay(mymemo.GetDialog(2));
}
Helper methods
}备忘录模式
备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。
备注
管理者对象向原发器对象请求一个备忘录对象,此时管理这负责暂时保存备忘录。如果原发器需要恢复原来的状态,管理者就吧自己的备忘录传回给它。备忘录对象是被动的,只有创建备忘录的原发器会对它的状态进行赋值和检索。


浙公网安备 33010602011771号