您的位置:首页 > 其它

设计模式之备忘录模式

2013-09-09 22:00 197 查看
名词解释:

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

使用场景:

你在玩游戏,突然有事,此时如果关闭电脑,进度肯定木有了,然后你就点击保存,关闭电脑出去了;完事之后,你又点击加载进度,又开始玩了,这个就是一个标准的备忘录模式场景。

必需元素:

发起人:负责创建一个备忘录,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态 。发起人可根据需要决定备忘录存储发起人的哪些内部状态。

备忘录:负责存储发起人对象的内部状态,并可防止发起人以外的其他对象访问备忘录。备忘录有两个接口,管理者只能看到备忘录的窄接口,它只能将备忘录传递给其他对象。发起人能够看到一个宽接口,允许它访问到先前状态所需的所有数据。

管理者:负责保存好备忘录,不能对备忘录的内容进行操作或检查(其实就是来管理备忘录数据的)。

其实说白了,备忘录是一个实体类,存放所有要备忘的状态(属性);而发起人呢也有自己的状态(也可以成为属性),当然也必须有用于保存备忘录和恢复备忘录的方法;管理者中呢就是有一个备忘录的对象,当然是用于保存发起人保存的备忘录也供发起人恢复使用。

上例子:

发起者:

/// <summary>
/// 发起者
/// </summary>
class Originator
{
private string state;
/// <summary>
/// 要保存的属性(你可以随便添加哦)
/// </summary>
public string State
{
get { return state; }
set { state = value; }
}

/// <summary>
/// 创建备忘录
/// </summary>
/// <returns></returns>
public Memento CreateMemento()
{
return new Memento(state);
}

/// <summary>
/// 恢复备忘录
/// </summary>
/// <param name="memento"></param>
public void SetMemento(Memento memento)
{
state = memento.State;
}

public void Show()
{
Console.WriteLine("State="+state);
}

}


备忘录类:

/// <summary>
/// 备忘录
/// </summary>
class Memento
{
private string state;
/// <summary>
/// 保存的属性(通常和发起者类中的属性一一对应)
/// </summary>
public string State
{
get { return state; }
}
public Memento(string state)
{
this.state = state;
}
}


管理者:

/// <summary>
/// 管理者类(主要是隔离了发起者和备忘录,主要就是存放了备忘录对象)
/// </summary>
class Caretaker
{
private Memento memento;
/// <summary>
/// 备忘录对象
/// </summary>
public Memento Memento
{
get { return memento; }
set { memento = value; }
}
}


使用:

        //定义发起者对象
Originator o = new Originator();
//设置需要保存的属性
o.State = "ON";
o.Show();

//定义管理者对象
Caretaker c = new Caretaker();
//创建备忘录
c.Memento = o.CreateMemento();

//吸怪属性
o.State = "OFF";
o.Show();

//恢复备忘录
o.SetMemento(c.Memento);
o.Show();

Console.Read();


其实,这个备忘录模式应该是蛮简单的,就是一个类存储一些要保存的信息,可以进行保存和恢复,最主要是我们通过一个管理者类将发起者和备忘录类进行了隔离。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: