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

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

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

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

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

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

类图:

 

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

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

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

        一、原发器(Originator):

 

  1. //Originator 原发器 
  2. class PhoneOriginator 
  3.     public string Name { get; set; } 
  4.     public string Number { get; set; } 
  5.     public PhoneMemento SaveMemento() 
  6.     { 
  7.         return new PhoneMemento(Name, Number); 
  8.     } 
  9.     public void ResumeMemento(PhoneMemento phoneMemento) 
  10.     { 
  11.         this.Name = phoneMemento.Name
  12.         this.Number = phoneMemento.Number; 
  13.     } 
  14.     public void Display() 
  15.     { 
  16.         Console.WriteLine("------------------"); 
  17.         Console.WriteLine(Name); 
  18.         Console.WriteLine(Number); 
  19.     }    

        二、备忘录(Memento):

 

  1. //Memento 备忘录 
  2. class PhoneMemento 
  3.     public string Name { get; set; } 
  4.     public string Number { get; set; } 
  5.     public PhoneMemento(string name, string number) 
  6.     { 
  7.         this.Name = name
  8.         this.Number = number; 
  9.     } 

        三、看管者(Caretaker):

 

  1. //Caretaker 看管者 
  2. class PhoneCaretaker 
  3.     public PhoneMemento Memento { set; get; } 

        四、 客户端(Client) :

 

  1. //Client 客户端 
  2. class Program 
  3.     static void Main(string[] args) 
  4.     { 
  5.         PhoneOriginator po = new PhoneOriginator(); 
  6.         po.Name = "张三"
  7.         po.Number = "13880191995"
  8.         po.Display(); 
  9.         PhoneCaretaker pcaretaker = new PhoneCaretaker(); 
  10.         pcaretaker.Memento = po.SaveMemento(); 
  11.  
  12.         po.Name = "李丽"
  13.         po.Number = "13669595999"
  14.         po.Display(); 
  15.  
  16.         po.ResumeMemento(pcaretaker.Memento); 
  17.         po.Display(); 
  18.         Console.ReadLine(); 
  19.  
  20.     } 

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