备忘录Memento Pattern模式q文档格式.docx
《备忘录Memento Pattern模式q文档格式.docx》由会员分享,可在线阅读,更多相关《备忘录Memento Pattern模式q文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
private
String
state;
5.
6.
//工厂方法,返还一个新的备忘录对象
7.
Memento
createMemento(){
8.
return
new
Memento(state);
9.
}
10.
11.
//将发起人恢复到备忘录对象所记载的状态
12.
void
restoreMemento(Memento
memento){
13.
this.state
=
memento.getState();
14.
15.
16.
//状态的取值方法
17.
getState(){
18.
this.state;
19.
20.
21.
//状态的赋值方法
22.
setState(String
state){
23.
24.
System.out.println("
Current
state
"
+
this.state);
25.
26.
27.
28.
备忘录模式要求备忘录对象提供两个不同的接口:
一个宽接口提供给发起人对象,另一个窄接口提供给所有其他的对象,包括负责人对象。
29.
宽接口允许发起人读取到所有的数据;
窄接口只允许它把备忘录对象传给其他的对象而看不到内部的数据。
30.
//备忘录角色
31.
Memento{
32.
33.
34.
Memento(String
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
负责人角色负责保存备忘录对象,但是从不修改(甚至不查看)备忘录对象的内容(一个更好的实现是负责人对象根本无法从备忘录
48.
对象中读取个修改其内容)
49.
50.
//负责人角色
51.
Caretaker{
52.
memento;
53.
54.
//备忘录的取值方法
55.
retrieveMemento(){
56.
this.memento;
57.
58.
59.
//备忘录的赋值方法
60.
saveMemento(Memento
61.
this.memento
62.
63.
64.
65.
//客户端
66.
Client{
67.
static
Originator
o
Originator();
68.
Caretaker
c=
Caretaker();
69.
main(String[]
args){
70.
//该负责人对象的状态
71.
o.setState("
On"
);
72.
//创建备忘录对象,并将发起人对象的状态存储起来
73.
c.saveMemento(o.createMemento());
74.
//修改发起人对象的状态
75.
Off"
76.
//恢复发起人对象的状态
77.
o.restoreMemento(c.retrieveMemento());
78.
79.
80.
首先将发起人对象的状态设置成“On”(或者任何有效状态),并且创建一个备忘录对象将这个状态存储起来;
然后将发起人对象
81.
的状态改成“Off”(或者任何状态);
最后又将发起人对象恢复到备忘录对象所存储起来的状态,即“On”状态(或者先前所
82.
存储的任何状态)
83.
84.
备忘录系统运行的时序是这样的:
85.
(1)将发起人对象的状态设置成“On”。
86.
(2)调用发起人角色的createMemento()方法,创建一个备忘录对象将这个状态存储起来。
87.
(3)将备忘录对象存储到负责人对象中去。
88.
备忘录系统恢复的时序是这样的:
89.
(1)将发起人对象的状态设置成“Off”;
90.
(2)将备忘录对象从负责人对象中取出;
91.
(3)将发起人对象恢复到备忘录对象所存储起来的状态,“On”状态。
92.
93.
白箱实现的优缺点
94.
白箱实现的一个明显的好处是比较简单,因此常常用做教学目的。
白箱实现的一个明显的缺点是破坏对发起人状态的封装。
95.
96.
窄接口或者黑箱实现
97.
//发起人角色
98.
99.
100.
101.
Originator(){
102.
103.
104.
105.
MementoIF
106.
Memento(this.state);
107.
108.
109.
//将发起人恢复到备忘录对象记录的状态
110.
restoreMemento(MementoIF
111.
aMemento
(Memento)memento;
112.
this.setState(aMemento.getState());
113.
114.
115.
116.
117.
118.
119.
setState(){
120.
121.
state);
122.
123.
124.
protected
implements
MementoIF{
125.
savedState;
126.
Mememto(String
someState){
127.
savedState
someState;
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
interface
MementoIF{}
141.
142.
143.
144.
145.
146.
147.
148.
149.
saveMemento(MementoIF
150.
151.
152.
153.
154.
155.
156.
c
157.
158.
main(String
args[]){
159.
//改变负责人对象的状态
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
黑箱实现运行时的时序为;
171.
172.
(2)调用发起人角色的
createMemento()方法,创建一个备忘录对象将这个状态存储起来。
173.
由于负责人对象拿到的仅是
MementoIF类型,因此无法读出备忘录内部的状态。
174.
恢复时的时序为:
175.
176.
(2)将备忘录对象从负责人对象中取出。
注意此时仅能得到
MementoIF接口,因此无法读出此对象的内部状态
177.
(3)将发起人对象的状态恢复成备忘录对象所存储起来的状态,,由于发起人对象的内部类Memento实现了MementoIF接口
178.
这个内部类是传入的备忘录对象的真实类型,因此发起人对象可以利用内部类Memento
的私有
接口读出此对象的内部状态
179.
180.存储多个状态的备忘录模式:
181.
182.
import
java.util.Vector;
183.
java.util.Enumeration;
184.
185.
186.
Vector
states;
187.
int
index;
188.
189.
190.
states
Vector();
191.
index
0;
192.
193.
194.
createMementor(){
195.
Mementor(states,index);
196.
197.
198.
restoreMementor(Mementor
199.
memento.getStates();
200.
memento.getIndex();
201.
202.
203.
204.
this.states.addElement(state);
205.
++;
206.
207.
208.
//辅助方法,打印出所有的状态
209.
printStates(){
210.
Total
number
of
states:
index);
211.
for(Enumeration
e
states.elements();
e.hasMoreElements();
){
212.
system.out.println(e.nextElement());
213.
214.
215.
}
216.
217.
218.
219.
220.
221.
222.
223.
224.
Memento(Vector
states,int
index){
225.
this.states
(Vector)states.clone();
226.
this.index
227.
228.
229.
//状态取值方法
230.
getStates(){
231.
232.
233.
234.
//检查点取值方法
235.
get