ImageVerifierCode 换一换
格式:DOCX , 页数:28 ,大小:30.45KB ,
资源ID:4911372      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4911372.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(备忘录Memento Pattern模式q.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

备忘录Memento Pattern模式q.docx

1、备忘录Memento Pattern模式q备忘录(Memento Pattern)模式 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式。 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉住,并外部化 存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。备忘录模式常常与命令模式和迭代子模式一同使用。 常见的软件系统往往不止存储一个状态,而是需要存储多个状态。这些状态常常是一个对象历史发展的不同阶段的快照,存储这些快照的备忘录对象 叫做此对象的历史,某一个快照所处的位

2、置叫做检查点。 备忘录角色: 备忘录角色有如下的责任。 1、将发起人(Originator)对象的内部状态存储起来,备忘录可以根据发起人对象的判断来决定存储多少 发起人(Originator)对象的内部状态。 2、备忘录可以保护其内容不被发起人对象之外的任何对象所读取。备忘录有两个等效的接口: 1、窄接口:负责人(Caretaker)对象(和其他除发起人对象之外的任何对象)看到的是备忘录的窄 接(narrow interface),这个窄接口只允许它把备忘录对象传给其他的对象; 2、宽接口:与负责人对象看到的窄接口相反的是,发起人对象可以看到一个宽接口(wide interface), 这个宽

3、接口允许它读取所有的数据,以便根据数据恢复这个发起人对象的内部状态。853P 发起人角色: 发起人角色有如下责任: 1、创建一个含有当前的内部状态的备忘录对象。 2、使用备忘录对象存储其内部状态。 负责人角色: 负责人角色有如下的责任: 1、负责保存备忘录对象 2、不检查备忘录对象的内容。Java代码 1. 宽接口和白箱: 2. 发起人角色 3. publicclassOriginator 4. privateStringstate; 5. 6. /工厂方法,返还一个新的备忘录对象 7. publicMementocreateMemento() 8. returnnewMemento(stat

4、e); 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=

5、+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. re

6、turnthis.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. re

7、turnthis.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.

8、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”状

9、态(或者先前所 82. 存储的任何状态) 83. 84. 备忘录系统运行的时序是这样的: 85. (1)将发起人对象的状态设置成“On”。 86. (2)调用发起人角色的createMemento()方法,创建一个备忘录对象将这个状态存储起来。 87. (3)将备忘录对象存储到负责人对象中去。 88. 备忘录系统恢复的时序是这样的: 89. (1)将发起人对象的状态设置成“Off”; 90. (2)将备忘录对象从负责人对象中取出; 91. (3)将发起人对象恢复到备忘录对象所存储起来的状态,“On”状态。 92. 93. 白箱实现的优缺点 94. 白箱实现的一个明显的好处是比较简单,因此常常用

10、做教学目的。白箱实现的一个明显的缺点是破坏对发起人状态的封装。 95. 96. 窄接口或者黑箱实现 97. /发起人角色 98. publicclassOriginator 99. privateStringstate; 100. 101. publicOriginator() 102. 103. 104. /工厂方法,返还一个新的备忘录对象 105. publicMementoIFcreateMemento() 106. returnnewMemento(this.state); 107. 108. 109. /将发起人恢复到备忘录对象记录的状态 110. publicvoidrestore

11、Memento(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. protectedclassMemento

12、implementsMementoIF 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. publicinterfaceMemen

13、toIF 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();

14、 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. 16

15、8. 169. 170. 黑箱实现运行时的时序为; 171. (1)将发起人对象的状态设置成“On”。 172. (2)调用发起人角色的createMemento()方法,创建一个备忘录对象将这个状态存储起来。 173. (3)将备忘录对象存储到负责人对象中去。由于负责人对象拿到的仅是MementoIF类型,因此无法读出备忘录内部的状态。 174. 恢复时的时序为: 175. (1)将发起人对象的状态设置成“Off”; 176. (2)将备忘录对象从负责人对象中取出。注意此时仅能得到MementoIF接口,因此无法读出此对象的内部状态 177. (3)将发起人对象的状态恢复成备忘录对象所存储起

16、来的状态,由于发起人对象的内部类Memento实现了MementoIF接口 178. 这个内部类是传入的备忘录对象的真实类型,因此发起人对象可以利用内部类Memento的私有接口读出此对象的内部状态 179. 180. 存储多个状态的备忘录模式: 181. /发起人角色 182. importjava.util.Vector; 183. importjava.util.Enumeration; 184. 185. publicclassOriginator 186. privateVectorstates; 187. privateintindex; 188. 189. publicOrigi

17、nator() 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) 2

18、04. 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.

19、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. intget

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1