备忘录模式

备忘录模式:

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

说白了,就是对对象数据做保存和还原,并防止外部对数据修改。主要用于需要数据回滚的情况。

 

一、UML结构图

 

 

二、示例代码

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 
  6 namespace 备忘录模式
  7 {
  8     class Program
  9     {
 10         static void Main(string[] args)
 11         {
 12             Originator o = new Originator();
 13             o.State1 = "A1";
 14             o.State2 = 2;
 15             o.State3 = "B3";
 16             Console.WriteLine(string.Format("当前原数数据状态:\n{0,5}", o.ToString()));
 17             Console.WriteLine();
 18 
 19             //保存当前状态            
 20             Caretaker c = new Caretaker();
 21             c.Memento= o.SaveInfo();
 22             Console.WriteLine(string.Format("已保存原始数据状态:\n     S1={0},S2={1}", c.Memento.GetState1,c.Memento.GetState2));
 23             Console.WriteLine();
 24 
 25             Console.WriteLine("现在更改还原数据...");
 26             o.State1 = "A2";
 27             o.State2 = 3;
 28             o.State3="B2";
 29             Console.WriteLine(string.Format("更改原数数据状态后:\n{0,5}",o.ToString()));
 30             Console.WriteLine();
 31 
 32             Console.WriteLine("现在还原数据...");
 33             o.Recove(c.Memento);
 34             Console.WriteLine(string.Format("还原后状态:\n{0,5}", o.ToString()));
 35 
 36             Console.WriteLine();
 37             Console.Read();
 38 
 39         }
 40     }
 41 
 42     /// <summary>
 43     /// 原始对象
 44     /// </summary>
 45     public class Originator
 46     {
 47         private string m_State1;
 48         /// <summary>
 49         /// 状态1
 50         /// </summary>
 51         public string State1
 52         {
 53             get { return m_State1; }
 54             set { m_State1 = value; }
 55         }
 56 
 57         private int m_State2;
 58         /// <summary>
 59         /// 状态2
 60         /// </summary>
 61         public int State2
 62         {
 63             get { return m_State2; }
 64             set { m_State2 = value; }
 65         }
 66 
 67         private string m_State3;
 68         /// <summary>
 69         /// 状态3
 70         /// </summary>
 71         public string State3
 72         {
 73             get { return m_State3; }
 74             set { m_State3 = value; }
 75         }
 76 
 77         public Memento SaveInfo()
 78         {
 79             return new Memento(m_State1, m_State2);            
 80         }
 81 
 82         /// <summary>
 83         /// 还原
 84         /// </summary>
 85         /// <param name="m"></param>
 86         public void Recove(Memento m)
 87         {
 88             if (m != null)
 89             {
 90                 m_State1 = m.GetState1;
 91                 m_State2 = m.GetState2;
 92             }
 93         }
 94 
 95         public override string ToString()
 96         {
 97             return string.Format("State1={0},State2={1},State3={2}", m_State1, m_State2, m_State3);
 98         }
 99     }
100 
101     /// <summary>
102     /// 备忘录(用于保存原始对象部分信息,不需要外界知道原始对象的全部内容)
103     /// 备忘录对象只提供两个接口,一个存储信息,一个读取信息。
104     /// </summary>
105     public class Memento
106     {
107         private string m_State1;
108         private int m_State2;
109 
110         public Memento(string s1, int s2)
111         {
112             m_State1 = s1;
113             m_State2 = s2;
114         }
115 
116         public String GetState1
117         {
118             get { return m_State1; }
119         }
120         public int GetState2
121         {
122             get { return m_State2; }
123         }
124     }
125 
126     /// <summary>
127     /// 管理者类,只用于对备忘录进行保存和读取。
128     /// </summary>
129     public class Caretaker
130     {
131         Memento m_Memento = null;
132 
133         public Memento Memento
134         {
135             get { return m_Memento; }
136             set { m_Memento = value; }
137         }
138        
139     }
140      
141 }
备忘录示例代码

 

 

 

 

 

posted @ 2019-12-02 17:40  秋飘  阅读(169)  评论(0编辑  收藏  举报