备忘录(Memento Pattern)模式q.doc_第1页
备忘录(Memento Pattern)模式q.doc_第2页
备忘录(Memento Pattern)模式q.doc_第3页
备忘录(Memento Pattern)模式q.doc_第4页
备忘录(Memento Pattern)模式q.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

备忘录(Memento Pattern)模式 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式。 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉住,并外部化 存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。备忘录模式常常与命令模式和迭代子模式一同使用。 常见的软件系统往往不止存储一个状态,而是需要存储多个状态。这些状态常常是一个对象历史发展的不同阶段的快照,存储这些快照的备忘录对象 叫做此对象的历史,某一个快照所处的位置叫做检查点。 备忘录角色: 备忘录角色有如下的责任。 1、将发起人(Originator)对象的内部状态存储起来,备忘录可以根据发起人对象的判断来决定存储多少 发起人(Originator)对象的内部状态。 2、备忘录可以保护其内容不被发起人对象之外的任何对象所读取。备忘录有两个等效的接口: 1、窄接口:负责人(Caretaker)对象(和其他除发起人对象之外的任何对象)看到的是备忘录的窄 接(narrow interface),这个窄接口只允许它把备忘录对象传给其他的对象; 2、宽接口:与负责人对象看到的窄接口相反的是,发起人对象可以看到一个宽接口(wide interface), 这个宽接口允许它读取所有的数据,以便根据数据恢复这个发起人对象的内部状态。853P 发起人角色: 发起人角色有如下责任: 1、创建一个含有当前的内部状态的备忘录对象。 2、使用备忘录对象存储其内部状态。 负责人角色: 负责人角色有如下的责任: 1、负责保存备忘录对象 2、不检查备忘录对象的内容。Java代码 1. 宽接口和白箱: 2. 发起人角色 3. publicclassOriginator 4. privateStringstate; 5. 6. /工厂方法,返还一个新的备忘录对象 7. publicMementocreateMemento() 8. returnnewMemento(state); 9. 10. 11. /将发起人恢复到备忘录对象所记载的状态 12. publicvoidrestoreMemento(Mementomemento) 13. this.state=memento.getState(); 14. 15. 16. /状态的取值方法 17. publicStringgetState() 18. returnthis.state; 19. 20. 21. /状态的赋值方法 22. publicvoidsetState(Stringstate) 23. this.state=state; 24. System.out.println(Currentstate=+this.state); 25. 26. 27. 28. 备忘录模式要求备忘录对象提供两个不同的接口:一个宽接口提供给发起人对象,另一个窄接口提供给所有其他的对象,包括负责人对象。 29. 宽接口允许发起人读取到所有的数据;窄接口只允许它把备忘录对象传给其他的对象而看不到内部的数据。 30. /备忘录角色 31. publicclassMemento 32. privateStringstate; 33. 34. publicMemento(Stringstate) 35. this.state=state; 36. 37. 38. publicStringgetState() 39. returnthis.state; 40. 41. 42. publicvoidsetState(Stringstate) 43. this.state=state; 44. 45. 46. 47. 负责人角色负责保存备忘录对象,但是从不修改(甚至不查看)备忘录对象的内容(一个更好的实现是负责人对象根本无法从备忘录 48. 对象中读取个修改其内容) 49. 50. /负责人角色 51. publicclassCaretaker 52. privateMementomemento; 53. 54. /备忘录的取值方法 55. publicMementoretrieveMemento() 56. returnthis.memento; 57. 58. 59. /备忘录的赋值方法 60. publicvoidsaveMemento(Mementomemento) 61. this.memento=memento; 62. 63. 64. 65. /客户端 66. publicclassClient 67. privatestaticOriginatoro=newOriginator(); 68. privatestaticCaretakerc=newCaretaker(); 69. privatestaticvoidmain(Stringargs) 70. /该负责人对象的状态 71. o.setState(On); 72. /创建备忘录对象,并将发起人对象的状态存储起来 73. c.saveMemento(o.createMemento(); 74. /修改发起人对象的状态 75. o.setState(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. publicclassOriginator 99. privateStringstate; 100. 101. publicOriginator() 102. 103. 104. /工厂方法,返还一个新的备忘录对象 105. publicMementoIFcreateMemento() 106. returnnewMemento(this.state); 107. 108. 109. /将发起人恢复到备忘录对象记录的状态 110. publicvoidrestoreMemento(MementoIFmemento) 111. MementoaMemento=(Memento)memento; 112. this.setState(aMemento.getState(); 113. 114. 115. publicStringgetState() 116. returnthis.state; 117. 118. 119. publicvoidsetState() 120. this.state=state; 121. System.out.println(state=+state); 122. 123. 124. protectedclassMementoimplementsMementoIF 125. privateStringsavedState; 126. privateMememto(StringsomeState) 127. savedState=someState; 128. 129. 130. privatevoidsetState(StringsomeState) 131. savedState=someState; 132. 133. 134. privateStringgetState() 135. returnsavedState; 136. 137. 138. 139. 140. publicinterfaceMementoIF 141. 142. publicclassCaretaker 143. privateMementoIFmemento; 144. 145. publicMementoIFretrieveMemento() 146. returnthis.memento; 147. 148. 149. publicvoidsaveMemento(MementoIFmemento) 150. this.memento=memento; 151. 152. 153. 154. publicclassClient 155. privatestaticOriginatoro=newOriginator(); 156. privatestaticCaretakerc=newCaretaker(); 157. 158. publicstaticvoidmain(Stringargs) 159. /改变负责人对象的状态 160. o.setState(On); 161. /创建备忘录对象,并将发起人对象的状态存储起来 162. c.saveMemento(o.createMemento(); 163. /修改发起人对象的状态 164. o.setState(Off); 165. /恢复发起人对象的状态 166. o.restoreMemento(c.retrieveMemento(); 167. 168. 169. 170. 黑箱实现运行时的时序为; 171. (1)将发起人对象的状态设置成“On”。 172. (2)调用发起人角色的createMemento()方法,创建一个备忘录对象将这个状态存储起来。 173. (3)将备忘录对象存储到负责人对象中去。由于负责人对象拿到的仅是MementoIF类型,因此无法读出备忘录内部的状态。 174. 恢复时的时序为: 175. (1)将发起人对象的状态设置成“Off”; 176. (2)将备忘录对象从负责人对象中取出。注意此时仅能得到MementoIF接口,因此无法读出此对象的内部状态 177. (3)将发起人对象的状态恢复成备忘录对象所存储起来的状态,由于发起人对象的内部类Memento实现了MementoIF接口 178. 这个内部类是传入的备忘录对象的真实类型,因此发起人对象可以利用内部类Memento的私有接口读出此对象的内部状态 179. 180. 存储多个状态的备忘录模式: 181. /发起人角色 182. importjava.util.Vector; 183. importjava.util.Enumeration; 184. 185. publicclassOriginator 186. privateVectorstates; 187. privateintindex; 188. 189. publicOriginator() 190. states=newVector(); 191. index=0; 192. 193. 194. publicMementocreateMementor() 195. returnnewMementor(states,index); 196. 197. 198. publicvoidrestoreMementor(Mementormemento) 199. states=memento.getStates(); 200. index=memento.getIndex(); 201. 202. 203. publicvoidsetState(Stringstate) 204. this.states.addElement(state); 205. index+; 206. 207. 208. /辅助方法,打印出所有的状态 209. publicvoidprintStates() 210. System.out.println(Totalnumberofstates:+index); 211. for(Enumeratione=states.elements();e.hasMoreElements();) 212. system.out.println(e.nextElement(); 213. 214. 215. 216. 217. /备忘录角色 218. importjava.util.Vector; 219. 220. publicclassMemento 221. privateVectorstates; 222. privateintindex; 223. 224. publicMemento(Vectorstates,intindex) 225. this.states=(Vector)states.clone(); 226. this.index=index; 227. 228. 229. /状态取值方法 230. VectorgetStates() 231. returnstates; 232. 233. 234. /检查点取值方法 235. intgetIndex() 236. returnthis.index; 237. 238. 239. *备忘录的构造子克隆了传入的states,然后将克隆存入到备忘录对象内部,这是一个重要的细节,因为不这样的话,将会 240. 将会造成客户端和备忘录对象持有对同一个Vector对象的引用,也可以同时修改这个Vector对象,会造成系统崩溃。 241. 242. /负责人角色 243. importjava.util.Vector; 244. 245. publicclassCaretaker 246. privateOriginatoro; 247. privateVectormementos=newVector(); 248. privateintcurrent; 249. 250. publicCaretaker(Originatoro) 251. this.o=o; 252. current=0; 253. 254. 255. publicintcreateMemento() 256. Mementomemento=o.createMemento(); 257. mementos.addElement(memento); 258. returncurrent+; 259. 260. 261. /将发起人恢复到某个检查点 262. publicvoidrestoreMemento(intindex) 263. Mementomemento=(Memento)mementos.elementAt(index); 264. o.restoreMemento(memento); 265. 266. 267. /某个检查点删除 268. publicvoidremoveMemento(intindex) 269. mementos.removeElementAt(index); 270. 271. 272. 273. /客户端 274. publicclassClient 275. privatestaticOriginatoro=newOriginator(); 276. privatestaticCaretakerc=newCaretaker(o); 277. publicstaticvoidmain(Stringargs) 278. /改变状态 279. o.setState(state0); 280. /建立一个检查点 281. c.createMemento(); 282. /改变状态 283. o.setState(state1); 284. 285. c.createMemento(); 286. 287. o.setState(state2); 288. 289. c.createMemento(); 290. 291. o.setState(state3); 292. 293. c.createMemento(); 294. 295. o.setState(state4); 296. 297. c.createMemento(); 298. 299. o.printStates(); 300. 301. /恢复到第二个检查点 302. System.out.println(Restoringto2); 303. 304. c.restoreMemento(2); 305. 306. o.printStates(); 307. 308. System.out.println(Restoringto0); 309. 310. c.restoreMemento(0); 311. 312. o.printStates(); 313. 314. System.out.println(Restoringto3); 315. 316. c.restoreMemento(3); 317. 318. o.printStates(); 319. 320. 321. 322. 323. 324. 自述历史模式(备忘录模式的一个变种): 325. /窄接口 326. publicinterfaceMementoIF 327. 328. /发起人角色 329. publicclassOriginator 330. publicStringstate; 331. 332. publicOriginator() 333. 334. publicvoidchangeState(Stringstate) 335. this.state=state; 336. System.out.println(Statehasbeenchangedto:+state); 337. 338. 339. publicMementocreateMemento() 340. returnnewMemento(this); 341. 342. 343. publicvoidrestoreMemento(MementoIFmemento) 344. Mementom=(Memento)memento; 345. changeState(m.state); 346. 347. 348. classMementoimplementsMementoIF 349. privateStringstate; 350. 351. privateStringgetState() 352. returnstate; 353. 354. 355. privateMemento(Originatoro) 356. this.state=o.state; 357. 358. 359. 360. 361. /客户端 362. publicclassClient 363. privatestaticOriginatoro; 364. privatestaticMementoIFmemento; 365. 366. publicstaticvoidmain(Stringargs) 367. o=newOriginator(); 368. o.changeState(State1); 369. memento=o.createMemento(); 370. o.changeState(State2); 371. o.restoreMemento(memento); 372. 373. 374. 宽接口和白箱:发起人角色public class Originatorprivate String state;/工厂方法,返还一个新的备忘录对象public Memento createMemento()return new Memento(state);/将发起人恢复到备忘录对象所记载的状态public void restoreMemento(Memento memento)this.state = memento.getState();/状态的取值方法public String getState()return this.state;/状态的赋值方法public void setState(String state)this.state = state;System.out.println(Current state = + this.state);备忘录模式要求备忘录对象提供两个不同的接口:一个宽接口提供给发起人对象,另一个窄接口提供给所有其他的对象,包括负责人对象。宽接口允许发起人读取到所有的数据;窄接口只允许它把备忘录对象传给其他的对象而看不到内部的数据。/备忘录角色public class Mementoprivate String state;public Memento(String state)this.state = state;public String getState()return this.state;public void setState(String state)this.state = state;负责人角色负责保存备忘录对象,但是从不修改(甚至不查看)备忘录对象的内容(一个更好的实现是负责人对象根本无法从备忘录对象中读取个修改其内容)/负责人角色public class Caretakerprivate Memento memento;/备忘录的取值方法public Memento retrieveMemento()return this.memento;/备忘录的赋值方法public void saveMemento(Memento memento)this.memento = memento;/客户端public class Clientprivate static Originator o = new Originator();private static Caretaker c= new Caretaker();private static void main(String args)/该负责人对象的状态o.setState(On);/创建备忘录对象,并将发起人对象的状态存储起来c.saveMemento(o.createMemento();/修改发起人对象的状态o.setState(Off);/恢复发起人对象的状态o.restoreMemento(c.retrieveMemento();首先将发起人对象的状态设置成“On”(或者任何有效状态),并且创建一个备忘录对象将这个状态存储起来;然后将发起人对象的状态改成“Off”(或者任何状态);最后又将发起人对象恢复到备忘录对象所存储起来的状态,即“On”状态(或者先前所存储的任何状态)备忘录系统运行的时序是这样的:(1)将发起人对象的状态设置成“On”。(2)调用发起人角色的createMemento()方法,创建一个备忘录对象将这个状态存储起来。(3)将备忘录对象存储到负责人对象中去。备忘录系统恢复的时序是这样的:(1)将发起人对象的状态设置成“Off”;(2)将备忘录对象从负责人对象中取出;(3)将发起人对象恢复到备忘录对象所存储起来的状态,“On”状态。白箱实现的优缺点白箱实现的一个明显的好处是比较简单,因此常常用做教学目的。白箱实现的一个明显的缺点是破坏对发起人状态的封装。窄接口或者黑箱实现/发起人角色public class Originatorprivate String state;public Originator()/工厂方法,返还一个新的备忘录对象public MementoIF createMemento()return new Memento(this.state);/将发起人恢复到备忘录对象记录的状态public void restoreMemento(MementoIF memento)Memento aMemento = (Memento)memento;this.setState(aMemento.getState();public String getState()return this.state;public void setState()this.state = state;System.out.println(state = + state);protected class Memento implements MementoIFprivate String savedState;private Mememto(String someState)savedState = someState;private void setState(String someState)savedState = someState;private String getState()return savedState;public interface MementoIFpublic class Caretakerprivate MementoIF memento;publi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论