极速理解设计模式系列:19.备忘录模式(Memento Pattern)

四个角色:原发器(Originator)、备忘录(Memento)、看管者(Caretaker)、客户端(Client) 

        原发器(Originator):需要备忘录来记忆其内部状态的原型。可以将本类状态保存到备忘录,也可以通过备忘录恢复状态。

        备忘录(Memento):保持原发器的内部状态,

        看管者(Caretaker):看管备忘录,不可修改备忘录。

        客户端(Client) :执行原发器保存备忘录可恢复。

实现思路:客户端生产原发器,在原发器保存备忘录到看管者,原发器继续改变其状态,当需要时从看管者那里的备忘录获取已保存的状态以更新自身原发器状态。

类图:

极速理解设计模式系列:19.备忘录模式(Memento Pattern)

 

应用场景:电话备忘保存。

分析:某人的电话保存到备忘录时,如果需要恢复,通过保管者调用备忘录到原发器类恢复即可。

        下面我们在控制台程序去演示一下如何使用Memento Pattern:

        一、原发器(Originator):

极速理解设计模式系列:19.备忘录模式(Memento Pattern)
    //Originator 原发器
class PhoneOriginator
{
public string Name { get; set; }
public string Number { get; set; }
public PhoneMemento SaveMemento()
{
return new PhoneMemento(Name, Number);
}
public void ResumeMemento(PhoneMemento phoneMemento)
{
this.Name = phoneMemento.Name;
this.Number = phoneMemento.Number;
}
public void Display()
{
Console.WriteLine("------------------");
Console.WriteLine(Name);
Console.WriteLine(Number);
}
}
极速理解设计模式系列:19.备忘录模式(Memento Pattern)

        二、备忘录(Memento):

极速理解设计模式系列:19.备忘录模式(Memento Pattern)
    //Memento 备忘录
class PhoneMemento
{
public string Name { get; set; }
public string Number { get; set; }
public PhoneMemento(string name, string number)
{
this.Name = name;
this.Number = number;
}
}
极速理解设计模式系列:19.备忘录模式(Memento Pattern)

        三、看管者(Caretaker):

    //Caretaker 看管者
class PhoneCaretaker
{
public PhoneMemento Memento { set; get; }
}

        四、 客户端(Client) :

极速理解设计模式系列:19.备忘录模式(Memento Pattern)
    //Client 客户端
class Program
{
static void Main(string[] args)
{
PhoneOriginator po = new PhoneOriginator();
po.Name = "张三";
po.Number = "13880191995";
po.Display();
PhoneCaretaker pcaretaker = new PhoneCaretaker();
pcaretaker.Memento = po.SaveMemento();

po.Name = "李丽";
po.Number = "13669595999";
po.Display();

po.ResumeMemento(pcaretaker.Memento);
po.Display();
Console.ReadLine();

}
}
极速理解设计模式系列:19.备忘录模式(Memento Pattern)

       如需源码请点击 MementoPattern.rar  下载。


本文转自程兴亮博客园博客,原文链接:http://www.cnblogs.com/chengxingliang/archive/2011/11/22/2246803.html,如需转载请自行联系原作者

上一篇:C++中引用详解


下一篇:Linux系统安装MySql步骤及截屏