C#设计模式系列:备忘录模式(Memento)

1、备忘录模式简介

1.1>、定义

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

1.2>、使用频率

  C#设计模式系列:备忘录模式(Memento) 

2、备忘录模式结构

2.1>、结构图

C#设计模式系列:备忘录模式(Memento)

2.2>、参与者

  备忘录模式参与者:

  ◊ Memento

    ° 为创建对象的各个部件指定抽象接口

    ° 防止Originator意外的其他对象访问备忘录。备忘录实际上有两个接口,Caretaker只能看到备忘录的窄接口,它只能将备忘录传递给其他对象。Originator能够看到一个宽接口,允许它访问返回到先前状态所需的所有数据。理想的情况是只允许生成备忘录的那个Originator访问本备忘录的内部状态。

  ◊ Originator

    ° 创建一个备忘录,记录当前时刻的内部状态。

    ° 使用备忘录恢复内部状态。

  ◊ Caretaker

    ° 负责保存备忘录

    ° 不能对备忘录的内容进行操作或检查

  在备忘录模式中,Caretaker负责把Originator创建的Memento进行备份,当需要的时候,Originator可以再使用Caretaker中保存的Memento进行恢复,Originator中的所有状态被恢复到备份操作之前的状态。

3、备忘录模式结构实现

C#设计模式系列:备忘录模式(Memento)

  Memento.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.MementoDesignPattern.Structural
{
public class Memento
{
private string _state; public Memento(string state)
{
this._state = state;
} public string State
{
get { return _state; }
}
}
}

  Originator.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.MementoDesignPattern.Structural
{
public class Originator
{
private string _state; public string State
{
get
{
return _state;
}
set
{
_state = value;
Console.WriteLine("State = " + _state);
}
} public Memento CreateMemento()
{
return (new Memento(_state));
} public void SetMemento(Memento memento)
{
Console.WriteLine("Restoring state...");
State = memento.State;
}
}
}

  Caretaker.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DesignPatterns.MementoDesignPattern.Structural
{
public class Caretaker
{
private Memento _memento; public Memento Memento
{
get
{
return _memento;
}
set
{
_memento = value;
}
}
}
}

  Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using DesignPatterns.MementoDesignPattern.Structural; namespace DesignPatterns.MementoDesignPattern
{
class Program
{
static void Main(string[] args)
{
Originator o = new Originator();
o.State = "On"; Caretaker c = new Caretaker();
c.Memento = o.CreateMemento(); o.State = "Off";
o.SetMemento(c.Memento);
}
}
}

  运行输出:

State = On
State = Off
Restoring state...
State = On
请按任意键继续. . .

4、备忘录模式应用分析

  备忘录模式适用情形:

  1>、必须保存一个对象在某一个时刻的部分状态,这样以后需要时才能恢复到先前的状态。

  2>、如果用一个接口来让其他对象直接得到被保存对象的内部状态,将会暴露对象的实现细节并破坏对象的封装性。

  备忘录模式特点:

  1>、保持封装边界。使用备忘录可以避免暴露一些只应由Originator管理却又必须存储在Originator之外的信息。该模式把可能很复杂的Originator内部信息对其他对象屏蔽起来,从而保持了封装边界。

  2>、简化Originator。在其他的保持封装性的设计中,Originator负责保持Client请求过的内部状态版本。把所存储管理的重任交给了Originator,让Client管理它们请求的状态将会简化Originator,并使得Client工作结束时无需通知Originator。

上一篇:Atitit. 类与对象的存储实现


下一篇:asp.net web api KnownTypeAttribute