备忘录模式:
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
说白了,就是对对象数据做保存和还原,并防止外部对数据修改。主要用于需要数据回滚的情况。
一、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 }
